C# 如何通过linq将列表中的每个值与其他列表进行比较

C# 如何通过linq将列表中的每个值与其他列表进行比较,c#,linq,C#,Linq,我有两份清单: ListA ListB 姓名 Marc micheal-micheal Jolie-Jolie 我想比较这两个列表A和B,如果它们有相同的名称,它应该返回true。如果一个列表的值与另一个不同,则应返回false;如果一个列表有2个值,而另一个列表有3个值,则也应返回false。 此叛逆返回值始终为false,即使它们具有相同的值: var SameNames=ListA.All(x=>ListB.All(y=>y.Name.Equals(x.Name)) 我做错事了?请看一篇关

我有两份清单:

ListA ListB

姓名

Marc

micheal-micheal

Jolie-Jolie

我想比较这两个列表A和B,如果它们有相同的名称,它应该返回true。如果一个列表的值与另一个不同,则应返回false;如果一个列表有2个值,而另一个列表有3个值,则也应返回false。 此叛逆返回值始终为false,即使它们具有相同的值:

var SameNames=ListA.All(x=>ListB.All(y=>y.Name.Equals(x.Name))


我做错事了?请看一篇关于微软的文章

你应该做一个函数来比较每个值。变量不是这个问题的解决方案

制作一个类似于示例的函数:

{
    static void Main()  
    {  
        // Create the IEnumerable data sources.  
        string[] names1 = System.IO.File.ReadAllLines(@"../../../names1.txt");  
        string[] names2 = System.IO.File.ReadAllLines(@"../../../names2.txt");  
  
        // Create the query. Note that method syntax must be used here.  
        IEnumerable<string> differenceQuery =  
          names1.Except(names2);  
  
        // Execute the query.  
        Console.WriteLine("The following lines are in names1.txt but not names2.txt");  
        foreach (string s in differenceQuery)  
            Console.WriteLine(s);  
  
        // Keep the console window open in debug mode.  
        Console.WriteLine("Press any key to exit");  
        Console.ReadKey();  
    }  
}  
/* Output:  
     The following lines are in names1.txt but not names2.txt  
    Potra, Cristina  
    Noriega, Fabricio  
    Aw, Kam Foo  
    Toyoshima, Tim  
    Guy, Wey Yuan  
    Garcia, Debra  
     */  
{
静态void Main()
{  
//创建IEnumerable数据源。
字符串[]names1=System.IO.File.ReadAllLines(@./../../../names1.txt);
字符串[]names2=System.IO.File.ReadAllLines(@./../../../names2.txt);
//创建查询。请注意,此处必须使用方法语法。
IEnumerable differenceQuery=
名称1.除(名称2)外;
//执行查询。
WriteLine(“以下行在names1.txt中,但不是names2.txt”);
foreach(differenceQuery中的字符串s)
控制台。写入线(s);
//在调试模式下保持控制台窗口打开。
Console.WriteLine(“按任意键退出”);
Console.ReadKey();
}  
}  
/*输出:
以下行位于names1.txt中,但不在names2.txt中
波特拉,克里斯蒂娜
法布里西奥诺列加
哦,金福
蒂姆,丰岛
盖伊,韦远
加西亚,黛布拉
*/  

有一篇关于微软的文章

你应该做一个函数来比较每个值。变量不是这个问题的解决方案

制作一个类似于示例的函数:

{
    static void Main()  
    {  
        // Create the IEnumerable data sources.  
        string[] names1 = System.IO.File.ReadAllLines(@"../../../names1.txt");  
        string[] names2 = System.IO.File.ReadAllLines(@"../../../names2.txt");  
  
        // Create the query. Note that method syntax must be used here.  
        IEnumerable<string> differenceQuery =  
          names1.Except(names2);  
  
        // Execute the query.  
        Console.WriteLine("The following lines are in names1.txt but not names2.txt");  
        foreach (string s in differenceQuery)  
            Console.WriteLine(s);  
  
        // Keep the console window open in debug mode.  
        Console.WriteLine("Press any key to exit");  
        Console.ReadKey();  
    }  
}  
/* Output:  
     The following lines are in names1.txt but not names2.txt  
    Potra, Cristina  
    Noriega, Fabricio  
    Aw, Kam Foo  
    Toyoshima, Tim  
    Guy, Wey Yuan  
    Garcia, Debra  
     */  
{
静态void Main()
{  
//创建IEnumerable数据源。
字符串[]names1=System.IO.File.ReadAllLines(@./../../../names1.txt);
字符串[]names2=System.IO.File.ReadAllLines(@./../../../names2.txt);
//创建查询。请注意,此处必须使用方法语法。
IEnumerable differenceQuery=
名称1.除(名称2)外;
//执行查询。
WriteLine(“以下行在names1.txt中,但不是names2.txt”);
foreach(differenceQuery中的字符串s)
控制台。写入线(s);
//在调试模式下保持控制台窗口打开。
Console.WriteLine(“按任意键退出”);
Console.ReadKey();
}  
}  
/*输出:
以下行位于names1.txt中,但不在names2.txt中
波特拉,克里斯蒂娜
法布里西奥诺列加
哦,金福
蒂姆,丰岛
盖伊,韦远
加西亚,黛布拉
*/  

您可以使用
var SameNames=ListA.SequenceEquals(ListB)
。将使用对象中定义的默认相等。如果两个对象中的任何一个为null,它将抛出异常。因此,请确保您的列表不为空

平等执行

class YourListItem{
公共字符串名称{get;set;}
公共覆盖布尔等于(对象对象对象)
{
if(obj是您的列表项其他){
返回此.Name==other.Name;
}
返回false;
}
public override int GetHashCode()=>this.Name.GetHashCode();
}
如果您需要一个自定义比较逻辑,而该逻辑并不真正“适合”对象
equals
方法,或者您需要多个不同的equality实现。您可以为您的类型创建另一个实现
IEqualityComparer
的类,并将其作为第二个参数
var SameNames=ListA.SequenceEquals(ListB,new MyEqualityComparer())
传递

相等比较器

类MyEqualityComparer:IEqualityComparer{
public bool等于(YourListItem第一,YourListItem第二){
返回first.Name==second.Name;
}
public int GetHashCode(YourListItem obj)=>obj.Name.GetHashCode();
}

注意:重写Equals时,您也应该始终实现GetHashCode。如果散列码不相同,它就像一个较短的equals(在某种意义上),equals是冗余的,不需要执行。如果哈希代码不同,许多使用EqualityComparers或Equals的预构建方法将不会运行Equals。默认的HashCode是对象引用,因此它会错误地匹配两个不相等的列表,而实际上应该相等(如果您没有过度使用HashCode)。为HashCode实现选择一些您认为与大多数对象不同的字段。如果你有一个像这样的小对象,它看起来很愚蠢,但是你可以有一个巨大的对象,它有复杂的Equals实现,或者基于反射的通用相等检查,速度很慢。因此,当HashCode不相同时,能够在大多数情况下完全跳过相等检查突然变得相关。

您可以使用
var SameNames=ListA.SequenceEquals(ListB)
。将使用对象中定义的默认相等。如果两个对象中的任何一个为null,它将抛出异常。因此,请确保您的列表不为空

平等执行

class YourListItem{
公共字符串名称{get;set;}
公共覆盖布尔等于(对象对象对象)
{
if(obj是您的列表项其他){
返回此.Name==other.Name;
}
返回false;
}
public override int GetHashCode()=>this.Name.GetHashCode();
}
如果您需要一个自定义比较逻辑,而该逻辑并不真正“适合”对象
equals
方法,或者您需要多个不同的equality实现。你可以用crea
bool result = new HashSet<string>(ListA).SetEquals(ListB);
var SameNames = ListA.All(x => ListB.All(y => y.Name.Equals(x.Name)));
var sameNames = listA.All(a => listB.Any(b => b.Name.Equals(a.Name)));
var listA = new List<string>() { "Andy", "Bobby", "Cindy" };
var listB = new List<string>() { "Andy", "Bobby", "Cindy", "David" };

var SameNames = listA.All(a => listB.Any(b => b.Name.Equals(a.Name)));
var listA_in_listB = listA.All(a => listB.Any(b => b.Name.Equals(a.Name)));
var listB_in_listA = listB.All(b => listA.Any(a => a.Name.Equals(b.Name)));

var sameNames = listA_in_listB && listB_in_listA;
var listA_in_listB = listA.All(a => listB.Any(b => b.Name.Equals(a.Name)));
var sameLength = listA.Length == listB.Length;

var sameNames = listA_in_listB && sameLength;
var isEqual = ListA.OrderBy(o=>o.Name).SelectMany(x=>x.Name).SequenceEqual(ListB.OrderBy(o=>o.Name).SelectMany(x => x.Name));