C# 返回列表1和列表2中的项匹配的列表
让我们假设我有两个列表,它们看起来像这样: 列表1:C# 返回列表1和列表2中的项匹配的列表,c#,linq,list,generics,C#,Linq,List,Generics,让我们假设我有两个列表,它们看起来像这样: 列表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:"it
[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"]
修改原始列表是可以的。最好的方法是什么?像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();
像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();
在此处使用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#。在这里使用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#。如果列表中没有重复项,您可以执行以下操作:
var combinedList = list2.Intersect(list1).ToList();
编辑:
[ID:2, Name:"item2"]
[ID:3, Name:"item3"]
[ID:5, Name:"item5"]
[ID:6, Name:"item6"]
正如@Matt Greer所指出的,您需要一个自定义的相等比较器,才能按预期工作。如果列表中没有重复项,您可以执行以下操作:
var combinedList = list2.Intersect(list1).ToList();
var result = list1.Intersect(list2).ToList();
编辑:
[ID:2, Name:"item2"]
[ID:3, Name:"item3"]
[ID:5, Name:"item5"]
[ID:6, Name:"item6"]
正如@Matt Greer所指出的,您将需要一个自定义的相等比较器,才能像您所期望的那样工作
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();
公共类MyEqualityComparer:IEqualityComparer
{
公共布尔等于(Foo x,Foo y)
{
返回x.Id==y.Id;
}
公共int GetHashCode(Foo obj)
{
返回obj.Id.GetHashCode();
}
}
var result=list1.Intersect(list2,new MyEqualityComparer()).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();
公共类MyEqualityComparer:IEqualityComparer
{
公共布尔等于(Foo x,Foo y)
{
返回x.Id==y.Id;
}
公共int GetHashCode(Foo obj)
{
返回obj.Id.GetHashCode();
}
}
var result=list1.Intersect(list2,new MyEqualityComparer()).ToList();
是否有“全部保留”或交叉点功能可用?我不熟悉C#。是否有“全部保留”或交集功能可用?我不熟悉C#。不要像这样使用Count-如果绝对必要,请使用Any。但是,Contains无论如何都将使用Equals,因此如果它被重写,它将做正确的事情。尽管如此,Intersect还是会更好。我很好奇,所以我阅读了任何一本书。这仅仅是因为它将返回任何匹配项,而不是枚举整个列表吗?是的,它更有效,并且更清楚地表达了您感兴趣的内容。不要像这样使用Count-如果绝对必要,请使用any。但是,Contains无论如何都将使用Equals,因此如果它被重写,它将做正确的事情。尽管如此,Intersect还是会更好。我很好奇,所以我阅读了任何一本书。这仅仅是因为它将返回任何匹配项,而不是枚举整个列表吗?是的,它更有效,更清楚地表达了您感兴趣的内容。这是一个人应该学习的概念。复制和粘贴东西对任何人都没有帮助。这是目前我拥有的最接近伪代码的东西。我对C不太了解,不能举个C的例子。我提供了我所能提供的。我想帮助解决这个问题,我会尽我所能提供帮助。实际上,在这种情况下,使用此代码的C#等价物将是一个糟糕的选择,因为LINQ是一个更好的方法。请注意,这种方法也是O(N*M)-使用两个大表可能会非常昂贵。我知道那会很贵。我提供了一个概念。我相信它可以在另一种情况下提供:)无论如何,这可能适用于另一种情况。谢谢你的评论;)这是一个人应该学习的概念。复制和粘贴东西对任何人都没有帮助。这是目前我拥有的最接近伪代码的东西。我对C不太了解,不能举个C的例子。我提供了我所能提供的。我想帮助解决这个问题,我会尽我所能提供帮助。实际上,在这种情况下,使用此代码的C#等价物将是一个糟糕的选择,因为LINQ是一个更好的方法。请注意,这种方法也是O(N*M)-使用两个大表可能会非常昂贵。我知道那会很贵。我提供了一个概念。我相信它可以在另一种情况下提供:)无论如何,这可能适用于另一种情况。谢谢你的评论;)@Breaked:这里没有“明确的”-只有当类型没有适当地覆盖Equals,并且列表中存在实际的不同对象时(与equal列表相反)。指出需要自定义相等比较器的可能性是很好的,但这并不一定是必需的。@Jon Skeet-是的,尽管OP提供的示例在我看来像是一个带有自定义类的列表,所以在这种情况下,没有自定义比较器就无法工作。@BrokenGlass:你怎么知道自定义类没有正确地重写Equals和GetHashCode?@Jon Skeet:我有一个预感;-)但是,是的,这当然是一种可能性,也是一种更干净的(imo)方法。@BrokenGlass:还要记住,匿名类型以一种通常合理的方式自动实现Equals和GetHashCode。我希望我能让编译器为自定义类型自动提供该实现:)@breake:这里没有“明确”的选项-只有当类型没有适当地覆盖Equals,并且列表中有实际的不同对象时(与equal列表相反)。指出需要自定义相等比较器的可能性是很好的,但这并不一定是必需的。@Jon Skeet-是的,尽管如此