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:)将检查它是否适合工作流并给出反馈:)