C# 创建HashSet的Intersect,并使用提取的ID'从类结构中删除项;s
假设我有以下几个类:C# 创建HashSet的Intersect,并使用提取的ID'从类结构中删除项;s,c#,list,intersection,hashset,C#,List,Intersection,Hashset,假设我有以下几个类: public class ServiceStatistics { public string LocalId { get; set; } public string OrganizationId { get; set; } public List<StatisticElements> Elements { get; } = new List<StatisticElements>(); } public class Stati
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; }
}
公共类服务统计信息
{
公共字符串LocalId{get;set;}
公共字符串OrganizationId{get;set;}
公共列表元素{get;}=new List();
}
公共类统计要素
{
公共字符串统计量{get;set;}
公共字符串类型{get;set;}
公共字符串ServiceName{get;set;}
}
我通过soap服务检索此类ServiceStatistics,并使用序列化/反序列化
每个ServiceStatistics都包含一组StatisticElements。我还有一个统计元素ID的静态列表,它们与计算相关。可以删除所有其他传入的StatisticElements ID。我需要站在我这边做这件事
因为SOAP服务不支持选择特定的StatisticElements ID
因此,我使用哈希集生成了一个静态类:
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();
}
}
公共静态类相关DutyPlans
{
私有静态哈希集相关dutyplan;
静态相关DutyPlans()
{
//只有原始ID的子集
relevantDutyPlans=新哈希集()
{
530,
1150,
1095,
};
}
公共静态哈希集GetRelevantDutyPlans()
{
返回相关的任务计划;
}
公共静态布尔包含(int planId)
{
返回相关的DUTYPLANS.Contains(planId);
}
//从中提取与验证相关的所有DutyPlan(哈希集)
//传入数据
公共静态列表提取器相关DutyPlans(列表PlanId)
{
var relevantPlans=新哈希集(PlanId);
相关计划。与(相关任务计划)交叉;
返回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);
List statistics=SoapService.GetStatistics(现在);
List incomingIds=新列表();
foreach(统计中的var项)
{
foreach(item.Statistic中的var元素)
{
incomingIds.Add(int.Parse(element.statisticad));
}
}
List extract=RelevantDutyPlans.ExtractRelevantDutyPlans(IncomingId);
现在我有了一个与进一步处理相关的ID列表。我想要实现的是删除所有类元素“StatisticElements”,其中“statisticad”不包含在上面生成的提取列表中
有什么想法吗
非常感谢您提供的任何帮助希望您可以使用selectMany展开收集并继续筛选
var filteredItems = statistics.SelectMany(s => s.Elements)
.Where(s => extract.Contains(Convert.ToInt32(s.StatisticId)))
.ToList();
希望您可以使用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)));
}
List statistics=SoapService.GetStatistics(现在);
foreach(统计中的var项)
{
item.Elements.RemoveAll(x=>!RelevantDutyPlans.Contains(int.Parse(x.statisticad));
}
现在只剩下一次相关的方法了。换一种方法怎么样。只需立即删除不相关的计划
List<ServiceStatistics> statistics = SoapService.GetStatistics(Now);
foreach(var item in statistics)
{
item.Elements.RemoveAll(x => !RelevantDutyPlans.Contains(int.Parse(x.StatisticId)));
}
List statistics=SoapService.GetStatistics(现在);
foreach(统计中的var项)
{
item.Elements.RemoveAll(x=>!RelevantDutyPlans.Contains(int.Parse(x.statisticad));
}
现在,您只剩下一次相关的数据。如果您需要保持原始的
统计数据的完整性(例如,如果您可能对其运行多个计划),您还可以使用LINQ创建一个新的列表
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
不提供构造,因此我将返回一个匿名对象,但您可以创建一个适当的DTO类。如果您需要保持原始statistcs
不变,也可以使用LINQ创建一个新的列表
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
不提供构造,因此我将返回一个匿名对象,但您可以创建一个适当的DTO类。您的Extract
返回错误的变量。您的Extract
返回错误的变量。这是一个非常好的方法,thx alot:)将检查它是否适合工作流并给出反馈:)这是一个非常好的方法,thx alot:)将检查它是否适合工作流并给出反馈:)