use*_*444 24 c# linq-to-objects list distinct
我有一个list<message>包含类型Guid和DateTime(以及其他属性)的属性.我想摆脱所有在列表中的项目,其中的Guid和DateTime是相同的(除了一个).有时候这两个属性会与列表中的其他项目相同,但其他属性会有所不同,所以我不能只使用.Distinct()
List<Message> messages = GetList();
//The list now contains many objects, it is ordered by the DateTime property
messages = from p in messages.Distinct( what goes here? );
Run Code Online (Sandbox Code Playgroud)
这就是我现在所拥有的,但似乎应该有更好的方法
List<Message> messages = GetList();
for(int i = 0; i < messages.Count() - 1) //use Messages.Count() -1 because the last one has nothing after it to compare to
{
if(messages[i].id == messages[i+1}.id && messages[i].date == message[i+1].date)
{
messages.RemoveAt(i+1);
{
else
{
i++
}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 66
LINQ to Objects无法以内置方式轻松提供此功能,但MoreLINQ有一个方便的DistinctBy方法:
messages = messages.DistinctBy(m => new { m.id, m.date }).ToList();
Run Code Online (Sandbox Code Playgroud)
Ada*_*dam 15
Jon Skeet DistinctBy肯定是要走的路,但如果你有兴趣定义自己的扩展方法,你可能会对这个更简洁的版本感兴趣:
public static IEnumerable<TSource> DistinctBy<TSource, TKey>
(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
var known = new HashSet<TKey>();
return source.Where(element => known.Add(keySelector(element)));
}
Run Code Online (Sandbox Code Playgroud)
它具有相同的签名:
messages = messages.DistinctBy(x => new { x.id, x.date }).ToList();
Run Code Online (Sandbox Code Playgroud)