Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
比较LINQ中两个对象的属性值_Linq_C# 4.0 - Fatal编程技术网

比较LINQ中两个对象的属性值

比较LINQ中两个对象的属性值,linq,c#-4.0,Linq,C# 4.0,我的代码列表列表1和列表列表2中有两个学生对象列表。 学生对象具有以下属性。 名字 姓氏 大学 我有下面的方法,其中我想使用LINQ比较两个列表中的对象之间各自属性的值。我在LINQ中找到了几个示例,展示了如何比较整数或字符串列表中的两个值,但没有找到任何示例比较列表中对象的属性值 `private CompareList(ref List<student> L1,ref List<student> L2) { // compare FirstName of L

我的代码
列表列表1
列表列表2
中有两个学生对象列表。 学生对象具有以下属性。

名字
姓氏
大学

我有下面的方法,其中我想使用LINQ比较两个列表中的对象之间各自属性的值。我在LINQ中找到了几个示例,展示了如何比较整数或字符串列表中的两个值,但没有找到任何示例比较列表中对象的属性值

`private CompareList(ref List<student> L1,ref List<student> L2)
 {
   // compare FirstName of L1 to L2
      ......

 }`
私有比较列表(参考列表L1,参考列表L2) { //比较L1和L2的名字 ...... }` 我该怎么做呢?
谢谢

您没有明确说明要检查什么,但如果您只是想知道两个集合是否相等,那么我想您可以这样检查:

bool isAnyElementFromL1NotInL2 = L1.Select(x => x.Name).Except(L2.Select(y => y.Name)).Any();
bool isAnyElementFromL2NotInL1 = L2.Select(x => x.Name).Except(L1.Select(y => y.Name)).Any();
bool areL1AndL2TheSame = !isAnyElementFromL1NotInL2 && !isAnyElementFromL2NotInL1;
另见


或者。

您没有明确说明要检查的内容,但如果您只是想知道两个集合是否相等,那么我想您可以这样检查:

bool isAnyElementFromL1NotInL2 = L1.Select(x => x.Name).Except(L2.Select(y => y.Name)).Any();
bool isAnyElementFromL2NotInL1 = L2.Select(x => x.Name).Except(L1.Select(y => y.Name)).Any();
bool areL1AndL2TheSame = !isAnyElementFromL1NotInL2 && !isAnyElementFromL2NotInL1;
另见


或者。

最好的方法是对
学生进行检查(类型通常为Pascal大小写)通过实现
IComparable
/
IStructuralComparable
IEquatable
/
IStructuralEquatable
或通过创建一个实现
IComparaer

的比较器类来进行比较,最好的方法是对
学生进行比较(类型通常是帕斯卡大小写的)通过实现
IComparable
/
IStructuralComparable
IEquatable
/
IStructuralEquatable
或通过创建一个实现
IComparaer

公共静态布尔比较的比较器类进行比较(参考列表列表1,参考列表2)
{
返回Enumerable.SequenceEqual(列表1,列表2,新的MyCustomComparer());
}
公共类MyCustomComparer:IEqualityComparer
{
公共布尔等于(学生x,学生y)
{
如果(x.FirstName==y.FirstName&&x.LastName==y.LastName&&x.University==y.University)
返回true;
返回false;
}
公共整数GetHashCode(学生对象)
{
抛出新的NotImplementedException();
}
}
公共静态布尔比较(参考列表列表1,参考列表2)
{
返回Enumerable.SequenceEqual(列表1,列表2,新的MyCustomComparer());
}
公共类MyCustomComparer:IEqualityComparer
{
公共布尔等于(学生x,学生y)
{
如果(x.FirstName==y.FirstName&&x.LastName==y.LastName&&x.University==y.University)
返回true;
返回false;
}
公共整数GetHashCode(学生对象)
{
抛出新的NotImplementedException();
}
}

首先,您需要在提出要求之前实际尝试并实现该方法。第二,你为什么要通过引用来传递你的列表?最后,为什么您觉得有必要使用Linq来实现这个问题?嗨,Ant,我想知道一种有效的方法来实现这个方法,这就是我为什么提出这个问题的原因。如果不是LINQ,那就是为什么我要问这个问题,这样我才能以一种合适的方式实现这个方法。我使用ref,以避免再次创建不必要的变量,从而提高效率。谢谢我认为你不明白
ref
的作用。它不会阻止创建不必要的变量。这只是意味着,如果要为
ref
传递的变量分配一个新列表,它将更改调用代码中的引用。如果省略了
ref
,则无法更改调用代码中的引用。无论您是否使用
ref
,每次调用都会在堆栈上创建一个新变量。嗨,神秘性,我确实了解ref的作用,它将变量L1设置为引用同一对象,而不创建对象的新副本,我不需要使用ref关键字,但如果对象列表很大,我只是出于谨慎。@Irfarino,你真的不明白
ref
是什么意思。
列表
(或任何
列表
——类型通常以Pascal大小写)是引用类型,这意味着它驻留在堆上,而变量(或方法参数)仅持有指向它的指针。使用
ref
时,将指针传递给指针。您的推理对于值类型(<代码>结构> /代码>)是有效的,它不应该是可变的或大的,因为它的大小,所以考虑将它们传递给方法。首先,在您这样问之前,实际上需要尝试并实现该方法。第二,你为什么要通过引用来传递你的列表?最后,为什么您觉得有必要使用Linq来实现这个问题?嗨,Ant,我想知道一种有效的方法来实现这个方法,这就是我为什么提出这个问题的原因。如果不是LINQ,那就是为什么我要问这个问题,这样我才能以一种合适的方式实现这个方法。我使用ref,以避免再次创建不必要的变量,从而提高效率。谢谢我认为你不明白
ref
的作用。它不会阻止创建不必要的变量。这只是意味着,如果要为
ref
传递的变量分配一个新列表,它将更改调用代码中的引用。如果省略了
ref
,则无法更改调用代码中的引用。无论您是否使用
ref
,每次调用都会在堆栈上创建一个新变量。嗨,神秘性,我确实了解ref的作用,它将变量L1设置为引用同一对象,而不创建对象的新副本,我不需要使用ref关键字,但如果对象列表很大,我只是出于谨慎。@Irfarino,你真的不明白
ref
是什么意思。
列表
(或任何
列表
——并且类型通常是Pascal大小写的)是引用类型,这意味着它驻留在堆上,并且变量(或方法参数)仅保存t