gpt4 book ai didi

c# - 使 List 可与 IEquatable 区分

转载 作者:行者123 更新时间:2023-11-30 13:54:28 27 4
gpt4 key购买 nike

我想让我的类(class)在存储在列表中时可以排序(按年龄)。

我读到这个:IComparable Vs IComparer我让我的类(class)可排序。

public class Student : IComparable<Student>
{
public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }

public int CompareTo(Student other)
{
if (this.Age > other.Age)
{
return 1;
}
else if (this.Age < other.Age)
{
return -1;
}
else
{
return 0;
}
}
}

List students = new List();

// And Filling students

students.Sort();

现在,我想让我的类(class)可区分,我的意思是当我调用 .Distinct() 时,它会删除重复的学生 ID。

我读了IEquatable VS IEqualityComparer和 Sort 一样(不给出参数)我希望调用 .Distinct() 时不传递参数。

public class Student : IEquatable<Student>
{
public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }

public bool Equals(Student other)
{
if (this.ID == other.ID)
{
return true;
}
else
{
return false;
}
}
}

List students = new List();

// And Filling students

students.Distinct();

但是当我使用它时什么也没有发生。为什么?

我如何实现 IEquatable 并使用 Distinct() 而不传递参数?

最佳答案

看什么Enumerable.Distinctdocs says :

The default equality comparer, Default, is used to compare values of the types that implement the IEquatable generic interface. To compare a custom data type, you need to implement this interface and provide your own GetHashCode and Equals methods for the type.

我没看到你的 Student类:

  • ...覆盖 Object.GetHashCode(...) .
  • ...覆盖 Object.Equals(...)

另一方面,Enumerable.Distinct返回:

...an unordered sequence that contains no duplicate values. It uses the default equality comparer, Default, to compare values.

因此,您需要将结果设置为一个变量:

var x = enumerable.Distinct();

考虑使用 HashSet<T>

也许您希望您的收藏包含独特的元素。如果是这种情况,请不要将元素存储在常规集合中以便稍后调用 Enumerable.Distinct() , 但使用 HashSet<T> 直接。

一旦你修复了你的 Student重写上述所有方法的类,您将能够按如下方式存储学生:

HashSet<Student> studentSet = new HashSet<Student();
studentSet.Add(new Student { ID = 1, Name = "Matías", Age = 32 });

// HashSet<T>.Add returns true if it could add the whole element.
// In our case, this if statement will never enter!
if(studentSet.Add(new Student { ID = 1, Name = "Matías", Age = 32 }))
{
}

关于c# - 使 List<Student> 可与 IEquatable<Student> 区分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42320476/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com