从列表中获取不同的值<;T>;在c#中
本文关键字:lt gt 获取 列表 | 更新日期: 2023-09-27 18:29:40
程序员们好!实际上,在向List添加一些值之后,我需要List中的不同值。我的代码是这样的
List<Employee_Details> Temp = new List<Employee_Details>();
Temp =(List<Employee_Details>) newform.Tag;
EMP_DETAILS.Concat(Temp).Distinct();
但我直接忽略并不添加值。
请帮帮我。
Distinct
倾向于为被比较的类型定义GetHashCode
和Equals
,或者提供相等比较器。如果两个对象具有相同的哈希代码,则会检查它们是否相等。
您可以为您的类型实现GetHashCode
和Equals
,但我有时发现,在一种情况下定义相等并不总是适用于所有情况,即在UI情况下,只检查两个对象的ID是否匹配就足够了,因为UI可能没有在实际可用的对象上定义所有相同的数据(因此,不可能总是满足一个真正的相等)。
所以我更喜欢为Employee_Details
实现IEqualityComparer<T>
类型,然后将其实例提供给Distinct
方法
public class EmployeeDetailsComparer : IEqualityComparer<Employee_Details>
{
#region IEqualityComparer<int> Members
public bool Equals(Employee_Details x, Employee_Details y)
{
//define equality
if(x == null)
{
return y == null;
}
else if(y == null) return false;
//now check the fields that define equality - if it's a DB record,
//most likely an ID field
return x.ID == y.ID; //this is just A GUESS :)
}
public int GetHashCode(Employee_Details obj)
{
//define how to get a hashcode
//most obvious would be to define it on the IDs,
//but if equality is defined across multiple fields
//then one technique is to XOR (^) multiple hash codes together
//null-check first
if(obj == null) return 0;
//now either:
return obj.ID.GetHashCode();
//or something like
return obj.FirstName.GetHashCode() ^ obj.Surname.GetHashCode();
}
#endregion
}
现在你可以做:
EMP_DETAILS.Concat(Temp).Distinct(new EmployeeDetailsComparer());
尽管注意实际上并没有做任何事情,但您需要捕获Concat
方法的返回值,无论是作为IEnumerable<Employee_Details>
,还是将其"实现"为数组或列表:
Employee_Details[] result =
EMP_DETAILS.Concat(Temp).Distinct(new EmployeeDetailsComparer()).ToArray();
现在用它替换EMP_DETAILS
。如果是List<Employee_Details>
,你可以做:
EMP_DETAILS =
EMP_DETAILS.Concat(Temp).Distinct(new EmployeeDetailsComparer()).ToList();
事实上,跨多个值实现一个好的哈希代码是很棘手的,但^
方法在大多数情况下都可以正常工作。目标是确保为不同的Employee_Details
实例获得不同的哈希代码。
Distinct
方法使用包含对象的Equals
比较。如果您在Employee_Details
中有Equals的默认实现,那么您可能会比较引用。
所以你必须选择:
- 为Employee_Details实现Equals方法
- 使用接受IEqualityComparer的Distinct方法的重载
您需要在类中实现IEqualityComparer<T>
,并提供自己的GetHashCode
和Equals
方法。
http://msdn.microsoft.com/en-us/library/ms132040.aspx
class Employee_Details : IEqualityComparer
{
public int Employee_ID;
public Employee_Details(int empID)
{
Employee_ID = empID;
}
public new bool Equals(object x, object y)
{
return x.ToString().Equals(y.ToString());
}
public int GetHashCode(object obj)
{
return obj.ToString().ToLower().GetHashCode();
}
public override String ToString()
{
return Employee_ID.ToString();
}
}