如何获取列表中没有的内容
本文关键字:何获取 获取 列表 | 更新日期: 2023-09-27 18:34:34
如果我有两个通用列表。 如何使用 LINQ 查找其他列表中没有的内容?
这是我的obj类:
public class tobj
{
public string column1;
public string column2;
}
以下是数组
tobj[] array1 =
{
new tobj { "1", "1" }, new tobj { "2", "2" }, new tobj { "3", "3" }
};
tobj[] array2 =
{
new tobj { "2", "2" }, new tobj { "3", "3" }, new tobj { "4", "4" }
};
var diff = array1.FinfDiff(array2);
foreach (var value in diff)
{
Console.WriteLine(value.column1); // 1
}
此代码尚未测试。
您可以使用
Except
. 但是,假设您有一个自定义类型,则需要重写Equals()
并GetHashCode()
以便它与 Linq 很好地配合使用。
这是因为 Linq 追求效率,因此它可以使用HashSet<T>
和其他机制来快速确定项目是否可能等效(等效的项目必须具有相同的哈希代码,否则您的哈希代码是错误的(。 因此,仅仅实现Equals()
是不够的,在将这种类型的方法与自定义类一起使用时,还必须实现GetHashCode()
。
例如:
public class tobj : IEquatable<tobj>
{
public string column1;
public string column2;
public bool Equals(tobj other)
{
return other != null ? Equals(column1, other.column1) && Equals(column2, other.column2) : false;
}
public override bool Equals(object obj)
{
return Equals(obj as tobj);
}
public override int GetHashCode()
{
// seed the code
int hash = 13;
// use some primes to mix in the field hash codes...
hash = hash * 17 + column1.GetHashCode();
hash = hash * 17 + column2.GetHashCode();
return hash
}
}
现在你已经覆盖了 GetHashCode(( 和 Equals(((我也喜欢自己实现IEquatable<T>
(,你可以使用 Except()
:
var results = array1.Except(array2);
foreach (var i in results)
{
Console.WriteLine(i.column1 + ":" + i.column2);
}
我建议在哈希代码算法上查看此SO线程,以获取有关实现良好算法的提示。
此外,作为旁注,某些类型(如 KeyValuePair
、 Tuple
和匿名类型(已经实现了 Equals()
并正确GetHashCode()
等效性,以便它们考虑其各个组件。
可以使用 IEnumerable 可用的 Except 方法。 它很容易实现。 您可以看到此处概述的示例:http://msdn.microsoft.com/en-us/library/bb336390.aspx
array2.ForEach(x => array1.Remove(x));
保留在 array1 中的就是您的结果
编辑:我看不见第一眼,物品不是"简单"的物体......正如詹姆斯所写,你需要覆盖平等