返回列表1和列表2中的项匹配的列表

时间:2011-04-07 16:25:29

标签: c# linq list generics

假设我有2 List<T> List1和List2,如下所示:

列表1

[ID:1, Name:"item1"]
[ID:2, Name:"item2"]
[ID:3, Name:"item3"]
[ID:4, Name:"item4"]

列表2:

[ID:2, Name:"item2"]
[ID:3, Name:"item3"]
[ID:5, Name:"item5"]
[ID:6, Name:"item6"]

如何获取仅包含两个列表中对象的列表?使用上面的例子,我想返回:

[ID:2, Name:"item2"]
[ID:3, Name:"item3"]

修改原始列表即可。最好的方法是什么?

4 个答案:

答案 0 :(得分:6)

  var result = list1.Intersect(list2).ToList();

最简洁。但请记住,它使用的默认相等比较器可能适用于您,也可能不适合您。如果没有,您可以提供自己的:

    public class MyEqualityComparer : IEqualityComparer<Foo>
    {
        public bool Equals(Foo x, Foo y)
        {
            return x.Id == y.Id;
        }

        public int GetHashCode(Foo obj)
        {
            return obj.Id.GetHashCode();
        }
    }

  var result = list1.Intersect(list2, new MyEqualityComparer()).ToList();

答案 1 :(得分:4)

如果列表中没有重复项,您可以执行此操作:

var combinedList = list2.Intersect(list1).ToList();

修改

正如@Matt Greer指出的那样,你需要一个自定义的相等比较器才能正常工作。

答案 2 :(得分:1)

和jQuery一样,答案总是LINQ!

var intersection = list1.Where(item => list2.Contains(item)).ToList();

假设列表包含实际引用的副本。如果没有,那么请执行:

var intersection = list1.Where(item => list2.Count(match => item.ID == match.ID && item.Name == match.Name) > 0).ToList();

答案 3 :(得分:-1)

在这里使用lua代码:

ArrayList1={}
ArrayList2={}

function inTable(tbl,val)
   for _,v in ipairs(tbl) do
      if v==val then return true end
   end
   return false
end

function getSame(tbl1,tbl2)
   returnArray={}
   for _,v in ipairs(tbl1) do
      if inTable(tbl2,v) then table.insert(returnArray,v) end
   end
end

newArray=getSame(arrayList1,arrayList2)

我对C#不太熟悉。