【问题标题】:Using C# lambda to find not matching elements in collection使用 C# lambda 在集合中查找不匹配的元素
【发布时间】:2014-10-10 08:42:41
【问题描述】:

我有两个从函数中获得的集合:

IEnumerable<InventoryItem> inventoryItems = get();
IEnumerable<InventoryItem> relatedItems = get();

我想为每个库存项目分配相关项目。但是,相关项目不能与库存项目本身匹配。这意味着库存项目不能拥有自己的相关项目。

我试图以这种方式跳过集合中的重叠元素:

foreach (var item in inventoryItems)
    {
      InventoryItem item1 = item;
      relatedItems.SkipWhile(x => x.RelatedItems.Contains(item1)).ForEach(i => item1.RelatedItems.Add(i));
      Save(item);
    }

这似乎不起作用。你们中的任何一个 Linq 用户有什么更好的建议吗? 我遇到的问题是SkipWhile(x =&gt; x.RelatedItems.Contains(item1)) 部分。另一部分在匹配项目时起作用,无论它们是否重叠

【问题讨论】:

  • 可能只有我一个人,但不清楚对您的项目进行分组的规则是什么。如果您添加实际值/结果的示例,问题将获胜。
  • 每个项目都有相关项目。这些相关项目不能包含它们被分配到的项目。
  • 旁注:“A 与 B 相关”因此“B 与 A 相关”似乎是很奇怪的“关系”......也许有更好的名字.
  • 这是一种单向关系。查看项目A会显示相关项目B,但查看项目B不会显示项目A
  • 只是不遵循您希望将relatedItems 集合中的项目映射到inventoryItems 中的项目的方式。不起作用的代码显然无助于理解所需的结果。

标签: c# linq lambda


【解决方案1】:

带有否定条件的Where 应该过滤掉您不需要的唯一项目(请注意,与!= 的comapison 可能需要替换为检查项目身份的其他条件)

    item1.RelatedItems = relatedItems
         .Where(x => !x.RelatedItems.Any(r => r!= item1)).ToList();

【讨论】:

  • 可行,但没有限制:relatedItems.ForEach(i => item.RelatedItems.Add(i));
【解决方案2】:

试试这个:

    public IEnumerable<T> GetNotMatchingElements<T>(IEnumerable<T> collection1, IEnumerable<T> collection2)
    {
        var combinedCollection = collection1.Union(collection2);
        var filteredCollection = combinedCollection.Except(collection1.Intersect(collection2));
        return filteredCollection;
    }

【讨论】:

    【解决方案3】:

    不确定我是否完全理解,但如果我理解了,这应该可以:

    foreach (var invItem in inventoryItems)
    {
        invItem.RelatedItems = relatedItems
            .Where(relItem => !relItem.RelatedItems.Contains(invItem)));
        Save(invItem);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 2012-11-24
      相关资源
      最近更新 更多