Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回列表1和列表2中的项匹配的列表_C#_Linq_List_Generics - Fatal编程技术网

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

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

让我们假设我有两个列表,它们看起来像这样:

列表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"]

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

像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-是的,尽管如此