创建 HashSet 的交集并从具有提取 ID 的 class 结构中删除项目
Create Intersect of HashSet and remove Items from class structure with extracted ID's
假设我有以下 classes:
public class ServiceStatistics
{
public string LocalId { get; set; }
public string OrganizationId { get; set; }
public List<StatisticElements> Elements { get; } = new List<StatisticElements>();
}
public class StatisticElements
{
public string StatisticId { get; set; }
public string Type { get; set; }
public string ServiceName { get; set; }
}
我通过肥皂服务检索此类 ServiceStatistics 并使用 serialization/deserialization。
每个 ServiceStatistics 都包含一组 StatisticElements。我还有一个与计算相关的 StatisticElements-ID 的静态列表。可以删除所有其他传入的 StatisticElements-ID。我需要在我这边做这件事
因为 SOAP 服务不支持选择特定的 StatisticElements-ID
所以我生成了一个带有 HashSet 的静态 Class:
public static class RelevantDutyPlans
{
private static HashSet<int> relevantDutyPlans;
static RelevantDutyPlans()
{
// only a subset of the original ID's
relevantDutyPlans = new HashSet<int>()
{
530,
1150,
1095,
};
}
public static HashSet<int> GetRelevantDutyPlans()
{
return relevantDutyPlans;
}
public static bool Contains(int planId)
{
return relevantDutyPlans.Contains(planId);
}
// Extracts all DutyPlans which are relevant (HashSet) for validation from
// the incoming data
public static List<int> ExtractRelevantDutyPlans(List<int> planIds)
{
var relevantPlans = new HashSet<int>(planIds);
relevantPlans.IntersectWith(relevantDutyPlans);
return relevantDutyPlans.ToList();
}
}
所以我的想法是,创建一个像这样的相交:
List<ServiceStatistics> statistics = SoapService.GetStatistics(Now);
List<int> incomingIds = new List<int>();
foreach(var item in statistics)
{
foreach(var element in item.Statistic)
{
incomingIds.Add(int.Parse(element.StatisticId));
}
}
List<int> extract = RelevantDutyPlans.ExtractRelevantDutyPlans(incomingIds);
所以现在我有一个与进一步处理相关的 ID 列表。我想要实现的是删除上面生成的提取列表中不包含的所有 class 元素 "StatisticElements" 和 "StatisticId"。
有什么想法吗?
非常感谢任何帮助
希望大家可以使用selectMany来展平集合,进行过滤。
var filteredItems = statistics.SelectMany(s => s.Elements)
.Where(s => extract.Contains(Convert.ToInt32(s.StatisticId)))
.ToList();
来点不同的方法怎么样。只需立即删除不相关的计划!
List<ServiceStatistics> statistics = SoapService.GetStatistics(Now);
foreach(var item in statistics)
{
item.Elements.RemoveAll(x => !RelevantDutyPlans.Contains(int.Parse(x.StatisticId)));
}
现在你只剩下相关的一次了。
如果您需要保持原始 statistcs
完整无缺,您也可以使用 LINQ 创建一个新的 List<>
- 例如如果你可能 运行 多个计划反对它。
var relevantStatistics = statistics.Select(s => new {
LocalId = s.LocalId,
OrganizationId = s.OrganizationId,
Elements = s.Elements.Where(e => !RelevantDutyPlans.Contains(Convert.ToInt32(e.StatisticId))).ToList()
});
由于 ServiceStatistics
不提供构造,我 return 一个匿名对象代替,但您可以创建一个适当的 DTO class。
假设我有以下 classes:
public class ServiceStatistics
{
public string LocalId { get; set; }
public string OrganizationId { get; set; }
public List<StatisticElements> Elements { get; } = new List<StatisticElements>();
}
public class StatisticElements
{
public string StatisticId { get; set; }
public string Type { get; set; }
public string ServiceName { get; set; }
}
我通过肥皂服务检索此类 ServiceStatistics 并使用 serialization/deserialization。
每个 ServiceStatistics 都包含一组 StatisticElements。我还有一个与计算相关的 StatisticElements-ID 的静态列表。可以删除所有其他传入的 StatisticElements-ID。我需要在我这边做这件事 因为 SOAP 服务不支持选择特定的 StatisticElements-ID
所以我生成了一个带有 HashSet 的静态 Class:
public static class RelevantDutyPlans
{
private static HashSet<int> relevantDutyPlans;
static RelevantDutyPlans()
{
// only a subset of the original ID's
relevantDutyPlans = new HashSet<int>()
{
530,
1150,
1095,
};
}
public static HashSet<int> GetRelevantDutyPlans()
{
return relevantDutyPlans;
}
public static bool Contains(int planId)
{
return relevantDutyPlans.Contains(planId);
}
// Extracts all DutyPlans which are relevant (HashSet) for validation from
// the incoming data
public static List<int> ExtractRelevantDutyPlans(List<int> planIds)
{
var relevantPlans = new HashSet<int>(planIds);
relevantPlans.IntersectWith(relevantDutyPlans);
return relevantDutyPlans.ToList();
}
}
所以我的想法是,创建一个像这样的相交:
List<ServiceStatistics> statistics = SoapService.GetStatistics(Now);
List<int> incomingIds = new List<int>();
foreach(var item in statistics)
{
foreach(var element in item.Statistic)
{
incomingIds.Add(int.Parse(element.StatisticId));
}
}
List<int> extract = RelevantDutyPlans.ExtractRelevantDutyPlans(incomingIds);
所以现在我有一个与进一步处理相关的 ID 列表。我想要实现的是删除上面生成的提取列表中不包含的所有 class 元素 "StatisticElements" 和 "StatisticId"。
有什么想法吗?
非常感谢任何帮助
希望大家可以使用selectMany来展平集合,进行过滤。
var filteredItems = statistics.SelectMany(s => s.Elements)
.Where(s => extract.Contains(Convert.ToInt32(s.StatisticId)))
.ToList();
来点不同的方法怎么样。只需立即删除不相关的计划!
List<ServiceStatistics> statistics = SoapService.GetStatistics(Now);
foreach(var item in statistics)
{
item.Elements.RemoveAll(x => !RelevantDutyPlans.Contains(int.Parse(x.StatisticId)));
}
现在你只剩下相关的一次了。
如果您需要保持原始 statistcs
完整无缺,您也可以使用 LINQ 创建一个新的 List<>
- 例如如果你可能 运行 多个计划反对它。
var relevantStatistics = statistics.Select(s => new {
LocalId = s.LocalId,
OrganizationId = s.OrganizationId,
Elements = s.Elements.Where(e => !RelevantDutyPlans.Contains(Convert.ToInt32(e.StatisticId))).ToList()
});
由于 ServiceStatistics
不提供构造,我 return 一个匿名对象代替,但您可以创建一个适当的 DTO class。