Guid
およびDateTime
タイプのプロパティ(およびその他のプロパティ)を含む_list<message>
_があります。 Guid
とDateTime
が同じ(1つを除く)であるリスト内のすべての項目を削除したいと思います。これら2つのプロパティはリスト内の他のアイテムと同じになることがありますが、他のプロパティは異なるため、.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? );
_
これは私が今持っているものですが、もっと良い方法があるはずだと思われます
_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++
}
}
_
LINQ to Objectsは組み込みの方法でこの機能を簡単に提供しませんが、 MoreLINQ には便利なDistinctBy
メソッドがあります。
messages = messages.DistinctBy(m => new { m.id, m.date }).ToList();
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)));
}
同じ署名があります:
messages = messages.DistinctBy(x => new { x.id, x.date }).ToList();
これはどうですか?
var messages = messages
.GroupBy(m => m.id)
.GroupBy(m => m.date)
.Select(m => m.First());
これを試して、
var messages = (from g1 in messages.GroupBy(s => s.id) from g2 in g1.GroupBy(s => s.date) select g2.First()).ToList();
私の PowerfulExtensions ライブラリをチェックしてください。現在は非常に若い段階にありますが、すでに多数のプロパティでDistinct、Union、Intersect、Exceptなどのメソッドを使用できます。
これはあなたがそれを使う方法です:
using PowerfulExtensions.Linq;
...
var distinct = myArray.Distinct(x => x.A, x => x.B);