c# - 如何在两组数据中找到部分不同的项目子集?

标签 c# .net linq set-theory

我正在尝试获取 dataA 中位于 dataB 中且具有不同属性 c 值的项目子集。属性 a 和 b 可以用作索引,因此我尝试仅过滤掉有用的对,然后检查它们是否具有不同的 c 值。

这是我想出的 linq 表达式,它确实有效,但似乎必须有更好/更快的方法来找到这个子集。

var itemsInBoth = from item in dataA
                  from item2 in dataB
                  where item.a == item2.a && item.b == item2.b
                      select new
                      {
                          first= item,
                          second = item2
                      };
var haveDifferentC = from item in itemsInBoth 
                     where item.first.c != item.second.c
                     select item.first;

最佳答案

根据 David B 提供的答案,我最终选择了他的方法的稍微修改版本。虽然差异很小,但我想我应该分享这个,主要是为了向那些喜欢表达语法的人(像我一样)展示一个版本。

此外,我决定使用匿名键/值对来简化结构,而不是分组。

var dictA = (from item in dataA
             select new
             {
                 key = CreateIndexValue(item.a, item.b),
                 value = item
             }).ToDictionary(kv => kv.key, kv => kv.value);
var dictB = (from item in dataB
             select new
             {
                 key = CreateIndexValue(item.a, item.b),
                 value = item
             }).ToDictionary(kv => kv.key, kv => kv.value);
var filesInBoth = from item in dictA
                  where dictB.ContainsKey(item.Key)
                  select new
                  {
                      itemA = dictA[item.Key],
                      itemB = dictB[item.Key]
                  };
var differentSize = from item in filesInBoth
                    where item.itemA.c!= item.itemB.c
                    select item.itemA;

关于c# - 如何在两组数据中找到部分不同的项目子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/606591/

相关文章:

C# - 这种技术如何称呼?

c# - 我想知道为什么我的处理函数同时运行它的所有函数而不是互相等待?

c# - WPF 中的可移植类库 ICommand 编译错误——不确定如何适本地解决这个问题?

c# - 使用 LINQ 将列表拆分为子列表

c# - 为什么 Asp.net MVC 不能区分具有不同参数的两个 Action ?

c# - 具有多个存储库和服务的 .NET MVC Controller ?

c# - 为什么我的属性声明 "field:"中需要 "[field:NonSerialized]"?

C# - 对象组合 - 删除样板代码

c# - 使用 linq 按具有空数据值的日期进行分组

c# - 从 XElement 中获取 2 个属性来创建字典 LINQ