- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想从列表中获取不同的对象。我尝试实现 IEqualityComparer
但没有成功。请查看我的代码并给我一个关于 IEqualityComparer
的解释。
public class Message
{
public int x { get; set; }
public string y { get; set; }
public string z { get; set; }
public string w { get; set; }
}
public class MessageComparer : IEqualityComparer<Message>
{
public bool Equals(Message x, Message y)
{
if (Object.ReferenceEquals(x, y)) return true;
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
if (x.x == y.x && x.y == y.y && x.z == y.z && x.w == y.w)
{
return true;
}
return false;
}
public int GetHashCode(Message number)
{
// if (Object.ReferenceEquals(number, null)) return 0;
int hashX = number.x.GetHashCode();
int hashY = number.y == null ? 0 : number.y.GetHashCode();
int hashZ = number.z == null ? 0 : number.z.GetHashCode();
int hashW = number.w == null ? 0 : number.w.GetHashCode();
return hashX ^ hashY ^ hashZ ^ hashW;
}
}
这是我的 List
和 Message
对象:
Message m1 = new Message();
m1.x = 1;
m1.y = "A";
m1.z = "B";
m1.w = "C";
Message m2 = new Message();
m2.x = 1;
m2.y = "A";
m2.z = "B";
m2.w = "C";
Message m3 = new Message();
m3.x = 1;
m3.y = "A";
m3.z = "B";
m3.w = "C";
Message m4 = new Message();
m4.x = 2;
m4.y = "A";
m4.z = "B";
m4.w = "C";
Message m5 = new Message();
m5.x = 3;
m5.y = "W";
m5.z = "D";
m5.w = "C";
Message m6 = new Message();
m6.x = 4;
m6.y = "S";
m6.z = "F";
m6.w = "R";
List<Message> collection = new List<Message>();
collection.Add(m1);
collection.Add(m2);
collection.Add(m3);
collection.Add(m4);
collection.Add(m5);
collection.Distinct(new MessageComparer());
当我调用Distinct()
方法时,collection
中的元素个数是一样的。
最佳答案
试试这个:
var distinct = collection.Distinct(new MessageComparer());
然后使用distinct
之后的任何事情。
您似乎忘记了 IEnumerable<>
的不变性. LINQ 方法都没有真正改变原始变量。相反,他们返回 IEnuerable<T>
s 其中包含表达式的结果。例如,让我们考虑一个简单的 List<string> original
内容{ "a", "a", "b", "c" }
.
现在,让我们调用original.Add("d");
.该方法没有返回值(它是 void
)。但是如果我们打印出 original
的内容,我们将看到 { "a", "a", "b", "c", "d" }
.
另一方面,我们现在调用original.Skip(1)
.此方法确实有一个返回值,类型为 IEnumerable<string>
.它是一个 LINQ 表达式,不会对原始集合执行任何副作用操作。因此,如果我们调用它并查看 original
,我们将看到 { "a", "a", "b", "c", "d" }
.但是,该方法的结果将为 { "a", "b", "c", "d" }
.如您所见,结果跳过了一个元素。
这是因为 LINQ 方法接受 IEnumerable<T>
作为参数。因此,他们对原始列表的实现没有概念。您可以通过扩展方法传递 ReadOnlyCollection
他们仍然可以通过它进行评估。然后,他们不能更改原始集合,因为可以用多种方式编写原始集合。
所有这些,但以表格形式。每行以原始 { "a", "a", "b", "c" }
开头:
Context Example function Immutable? Returned Value Collection after calling
Collection Add("d") No (void) { "a", "a", "b", "c", "d" }:
LINQ Skip(1) Yes { "a", "b", "c" } { "a", "a", "b", "c" }:
关于c# - 实现 IEqualityComparer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24924071/
'Equal' 和 'GetHashcode' 方法存在于对象类中,我们的类型继承了对象基类。 直接实现对象的两种方法和使用 IComparer 接口(interface)有什么区别? 如果我们覆盖对
在 .NET 中,IEnumerable延伸IEnumerable经常派上用场。令人沮丧的是IEqualityComparer和 IComparer不要扩展它们的非通用对应物,尽管 EqualityC
在我的应用程序的一部分中,我有一个选项可以显示当前艺术家不在音乐库中的专辑列表。为此,我调用音乐 API 来获取该艺术家的所有专辑列表,然后删除当前库中的专辑。 为了应对名称的不同大小写以及标题中丢失
假设我像这样实例化了一个字典 var dictionary = new Dictionary(); MyClass 是我自己的类,它实现了一个 IEqualityComparer<> . 现在,当我
我想为 Nullable 结构编写一个相等比较器。比方说,DateTime? .所以我想出了这段代码: public class NullableEntityComparer : IEqualityC
这是我的测试代码(包含没有在应该返回 true 的时候返回 true): HashSet test = new HashSet(new TilePositionCompare()); test.Add
我有一个不可变的值对象 IPathwayModule,其值定义为: (int) block ; (实体)模块,由(字符串)ModuleId 标识; (枚举)状态;和 (实体)类,由(字符串)Class
我有一个 List存储在我的计算机上的文件路径。我的目的是先过滤掉同名的文件,再过滤掉大小相同的文件。 为此,我创建了两个类来实现 IEqualityComparer , 并实现 Equals和 Ge
我只是想从两个列表中删除重复项并将它们合并到一个列表中。我还需要能够定义什么是重复项。我通过 ColumnIndex 属性定义了一个副本,如果它们相同,则它们是重复的。这是我采用的方法: 我找到了一个
我正在尝试设置一个使用字符串列表作为比较属性的 IEqualityComparer。 在下面的 2 行代码中使用 Except 和 Intersect 时,所有记录都被视为"new",没有一个被识别为
给定两个类 class Contract { public int ID {get; set;} // . . . } class DBContract { public in
我想知道是否有可能在 Distinct 中使用单例作为比较器对象?? 假设我有一个元素列表,我需要在该列表上使用不同的函数。通常我会这样做 var result = list.Distinct(ne
首先我看到IEqualityComparer for anonymous type那里的答案没有回答我的问题,很明显我需要一个 IEqualityComparer不和IComparer用于 Linq
我想从列表中获取不同的对象。我尝试实现 IEqualityComparer 但没有成功。请查看我的代码并给我一个关于 IEqualityComparer 的解释。 public class Messa
我的数据库中有一些相同编号的铃铛。我想得到所有这些而不重复。我创建了一个比较类来完成这项工作,但是该函数的执行导致没有 distinct 的函数出现很大的延迟,从 0.6 秒到 3.2 秒! 我做得对
我正在做一些需要自定义比较器的 LINQ,所以我创建了一个实现 IEqualityComparer 的新类.但是,当我使用它时,我每次都必须创建它的一个实例。 Dim oldListOnly = ol
IEqualityComparer 是否公开,其行为与相等 (=) 运算符相同? LanguagePrimitives 模块包含几个:FastGenericEqualityComparer、Gener
我正在努力实现以下目标: 我有一个表单,用户必须输入姓名、姓氏、地址……以及保存更改按钮。 我想让用户点击保存更改 仅当他确实进行了任何更改时才按下按钮。我发现通过简单地使用 IChangeTrack
我有一个自定义对象列表,我试图在其中删除重复记录。我看到很多在线文章都指向 IEqualityComparer(我以前从未使用过它)。 问题是,我应该什么时候使用它?我可以通过 LINQ 在一行代码中
我想要一个 IEqualityComparer当且仅当两个泛型类型相同且忽略泛型参数时返回 true。所以comparer.Equals(typeof(List), typeof(List))应该返回
我是一名优秀的程序员,十分优秀!