34

list<message>タイプGuidDateTime(および他のプロパティ)のプロパティを含むがあります。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++
    }
}
4

5 に答える 5

88

LINQ to Objectsは、この機能を組み込みの方法で簡単に提供することはできませんが、MoreLINQには便利なDistinctBy方法があります。

messages = messages.DistinctBy(m => new { m.id, m.date }).ToList();
于 2012-08-04T18:40:02.513 に答える
18

Jon Skeet'sDistinctByは間違いなく進むべき道ですが、独自の拡張メソッドを定義することに興味がある場合は、このより簡潔なバージョンに夢中になるかもしれません。

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();
于 2012-08-04T20:24:44.930 に答える
2

これを試して、

 var messages = (from g1 in messages.GroupBy(s => s.id) from g2 in g1.GroupBy(s => s.date) select g2.First()).ToList();
于 2018-08-10T19:42:20.290 に答える
1

私のPowerfulExtensionsライブラリをチェックしてください。現在は非常に若い段階ですが、すでにDistinct、Union、Intersect、Exceptなどのメソッドを任意の数のプロパティで使用できます。

これがあなたの使い方です:

using PowerfulExtensions.Linq;
...
var distinct = myArray.Distinct(x => x.A, x => x.B);
于 2013-08-15T20:23:36.300 に答える
0

これはどうですか?

var messages = messages
               .GroupBy(m => m.id)
               .GroupBy(m => m.date)
               .Select(m => m.First());
于 2012-08-04T18:48:36.663 に答える