获取不同的列表值

Lam*_*fif 11 .net c# asp.net asp.net-mvc

我有我想从一个获得C#应用程序List项目对象,其中包含不同对象另一个列表.

我试过这个

 List<Project> model = notre_admin.Get_List_Project_By_Expert(u.Id_user);
 if (model != null) model = model.Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)

列表模型仍包含4个相同的对象Project.

这是什么原因?我该如何解决?

Mar*_*ell 12

你需要在这里定义"相同".我猜你的意思是"有相同的内容",但这不是类的默认定义:默认定义是"是同一个实例".

如果您希望"相同"表示"具有相同的内容",则有两种选择:

  • 编写自定义比较器(IEqualityComparer<Project>)并将其作为参数提供给Distinct
  • 覆盖EqualsGetHashCode打开Project

还有许多自定义方法DistinctBy,如果可以通过单个属性(Id通常)确定标识,那么这些方法很有用- 但不是在BCL中.但是例如:

if (model != null) model = model.DistinctBy(x => x.Id).ToList();
Run Code Online (Sandbox Code Playgroud)

例如:

public static IEnumerable<TItem>
    DistinctBy<TItem, TValue>(this IEnumerable<TItem> items,
    Func<TItem, TValue> selector)
{
    var uniques = new HashSet<TValue>();
    foreach(var item in items)
    {
        if(uniques.Add(selector(item))) yield return item;
    }
}
Run Code Online (Sandbox Code Playgroud)


Nee*_*bey 6

var newList = 
(
from x in model
select new {Id_user= x.Id_user}
).Distinct();
Run Code Online (Sandbox Code Playgroud)

或者你可以写这样的

var list1 = model.DistinctBy(x=> x.Id_user);
Run Code Online (Sandbox Code Playgroud)


Tim*_*ter 5

你如何定义相同的?您应该覆盖EqualsProject这个定义(如果重写Equals也覆盖GetHashCode).例如:

public class Project
{
    public int ProjectID { get; set; }

    public override bool Equals(object obj)
    {
        var p2 = obj as Project;
        if (p2 == null) return false;
        return this.ProjectID == m2.ProjectID;
    }

    public override int GetHashCode()
    {
        return ProjectID;
    }
}
Run Code Online (Sandbox Code Playgroud)

否则你只是检查参考相等性.