创建 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。