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();
        }
    }