代码之家  ›  专栏  ›  技术社区  ›  ehcanadian

键值对键上的列表相交?

  •  3
  • ehcanadian  · 技术社区  · 14 年前

    如何根据键插入两个键值对列表?我尝试过:

    List<KeyValuePair<string, string>> listA = new List<KeyValuePair<string, string>>();
    List<KeyValuePair<string, string>> listB = new List<KeyValuePair<string, string>>();
    ...
    var result = listA.Intersect(listB);
    

    预期不会起作用。我是否需要根据键编写自己的比较器,或者是否有一种使用LINQ/lambda的简单方法?

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  7
  •   LukeH    14 年前
    var keysFromB = new HashSet<string>(listB.Select(x => x.Key));
    var result = listA.Where(x => keysFromB.Remove(x.Key));
    

    注意,此代码模拟 Intersect 通过使用 Remove 方法。这意味着两个序列都被视为集合:如果在 listA 然后 result 将只包含其中一个项目。如果你不想要这种行为,那么使用 Contains 方法而不是 去除 .

        2
  •  5
  •   Jon Skeet    14 年前

    犯罪嫌疑人 你必须自己写一个比较器-至少要用 Intersect .

    您可以使用来自的ProjectionQualityComparer MiscUtil 不过,为了让这一切变得简单:

    // Ick what a mouthful
    var comparer = ProjectionEqualityComparer<KeyValuePair<string, string>>.Create
           (x => x.Key);
    
    var result = listA.Intersect(listB, comparer);
    

    如果键在每个列表中都是唯一的,则另一个选项是联接:

    var commonPairs = from pairA in listA
                      join pairB in listB on pairA.Key equals pairB.Key
                      select new { pairA, pairB };