C# 从列表中获取不同的值<;T>;在c中#
嗨,程序员! 实际上,在向列表中添加一些值之后,我需要列表中的不同值。 我的代码是这样的C# 从列表中获取不同的值<;T>;在c中#,c#,list,union,C#,List,Union,嗨,程序员! 实际上,在向列表中添加一些值之后,我需要列表中的不同值。 我的代码是这样的 List<Employee_Details> Temp = new List<Employee_Details>(); Temp =(List<Employee_Details>) newform.Tag; EMP_DETAILS.Concat(Temp).Distinct(); List T
List<Employee_Details> Temp = new List<Employee_Details>();
Temp =(List<Employee_Details>) newform.Tag;
EMP_DETAILS.Concat(Temp).Distinct();
List Temp=new List();
Temp=(List)newform.Tag;
EMP_DETAILS.Concat(Temp.Distinct();
但是我直接忽略了,并且没有添加值
请帮助我。
Distinct
更喜欢为要比较的类型定义GetHashCode
和Equals
,或者提供相等比较器。如果两个对象具有相同的哈希代码,则会检查它们是否相等
您可以为您的类型实现GetHashCode
和Equals
,但有时我发现一种情况下的相等定义并不总是适用于所有情况,即在UI情况下,仅检查两个对象的ID是否匹配就足够了,因为UI可能没有在实际可用的对象上定义所有相同的数据(因此不能始终满足一个真正的等式)
因此,我更愿意为Employee\u Details
实现IEqualityComparer
类型,然后向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
}
尽管请注意,实际上并没有做任何事情,但您需要实际捕获Concat
方法的返回值,或者作为IEnumerable
,或者将其“实现”到数组或列表中:
Employee_Details[] result =
EMP_DETAILS.Concat(Temp).Distinct(new EmployeeDetailsComparer()).ToArray();
现在,您可以用它替换EMP\u详细信息。如果是列表
,您只需执行以下操作:
EMP_DETAILS =
EMP_DETAILS.Concat(Temp).Distinct(new EmployeeDetailsComparer()).ToList();
实际上,跨多个值实现一个好的hashcode是很棘手的-但是^
方法在大多数情况下都可以正常工作。目标是确保为不同的Employee\u详细信息
实例获取不同的hashcode。Distinct
方法使用Equals
对包含的对象进行比较。如果您在Employee\u Details
中默认实现了Equals,那么您可能会比较引用
因此,您必须选择:
为您的员工详细信息实施方法
使用不同方法的重载
您需要在类中实现并提供自己的GetHashCode
和Equals
方法
var list=(list)newform.Tag;var distinct=list.distinct()//列表distinct包含不同的值不完全正确distinct方法使用GetHashCode
来表示相等,如果两个对象具有相同的hashcode,则它会进行Equals
检查。因此,一个好的实现需要在类型本身上或通过IEqualityComparer
比较器定义这两者,比较器有自己的GetHashCode是-但是反编译它,看看它做了什么。它只是遵从对象。GetHashCode
,这对于自定义类型几乎是无用的。默认比较器-可能,但如果您自己实现它,您不能在那里放任何您想要的东西吗?。是的,对不起,您可以-因此您可以在类型本身上定义GetHashCode
方法,这可能很合适。不过,正如我在回答中所说,有时定义通用等式和散列码类型范围并不总是适用于其他情况。尤其是如果该对象来自数据库,并且并非所有情况下都始终加载所有数据。这就是为什么我个人更喜欢一个专门的IEqualityComparer
。但是,是的,如果一个类型的相等性总是可以确定的,那么在类型本身上定义它就更有意义了。非常感谢您的帮助。
EMP_DETAILS =
EMP_DETAILS.Concat(Temp).Distinct(new EmployeeDetailsComparer()).ToList();
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();
}
}