我得到了以下代码:
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。
答案 0 :(得分:6)
您有几种选择:
DistinctBy()
扩展方法Distinct()
重载,并实现自定义比较器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;
}
}