从集合的List <t>获取唯一ID记录</t>

时间:2011-11-20 22:40:41

标签: c# asp.net linq

我得到了以下代码:

public class Collect
{
     public string name{ get; set; }
     public int id { get; set; }
     public DateTime registerDate { get; set; }
}

public class ControllingMyList
{

    public void prepareList()
    {
        List<Collect> list = new List<Collect>();

        list= loadList();

        //Rest of the opperations
    }
}

考虑到我的loadList方法为我返回了许多重复记录(id变量)我想通过ID只获取一条记录。

Distinct()函数似乎是一个很好的解决方案,但是如果我没记错的话,Distinct()会过滤掉对象的所有成员,因为与“registerDate”变量的差别被认为是使其具有不同的标准,即使它具有相同的ID。

5 个答案:

答案 0 :(得分:6)

您有几种选择:

  • 使用MoreLinq项目中的DistinctBy()扩展方法
  • 使用接受自定义相等比较器的Distinct()重载,并实现自定义比较器
  • 使用Linq GroupBy( x=> x.id)然后获取每个组的第一项。

答案 1 :(得分:6)

    var list= loadList();

    list = list 
        .GroupBy(i => i.id)
        .Select(g => g.First())
        .ToList();

答案 2 :(得分:1)

传入使用id:

的比较器
public class idCompare : IEqualityComparer<Collect>
{
    public bool Equals(Collect x, Collect y)
    {
        return Equals(x.id, y.id);
    }

    public int GetHashCode(Collect obj)
    {
        return obj.id.GetHashCode();
    }
}

....

list.Distinct(new idCompare());

答案 3 :(得分:0)

static List GetUniques(IEnumerable collection,string attribute)其中T:Entity

    {
        Dictionary<string, bool> tempkvp = new Dictionary<string, bool>();
        List<T> uniques = new List<T>();
        List<string> columns = collection.FirstOrDefault().GetType().GetProperties().ToList().ConvertAll<string>(x => x.Name.ToLower());
        var property = attribute != null && collection.Count() > 0 && columns.Contains(attribute.ToLower()) ? ViewModelHelpers.GetProperty(collection.FirstOrDefault(), attribute) : null;
        if (property != null)
        {
            foreach (T obj in collection)
            {
                string value = property.GetValue(obj, null).ToString();
                if (!(tempkvp.ContainsKey(value)))
                {
                    tempkvp.Add(value, true);
                    uniques.Add(obj);
                }
            }
        }
        return uniques;
    }

答案 4 :(得分:-1)

实施IEquatable<T>并覆盖Equals和GetHashCode。你可以让那些只考虑id。

using System;

public class Collect : IEquatable<Collect>
{
     public string name{ get; set; }
     public int id { get; set; }
     public DateTime registerDate { get; set; }

     public bool Equals(Collect other)
     {
         if(other == null)
         {
                return false;
         }
         return this.id == other.id;
     }
}