2016-09-07 4 views
0

DISTINCT.ToList()が次の図のように適用された場合、結果リストからどの項目が削除されますか? 返される新しいリストに、重複の中の最初のエントリ(つまり、リストに最初に追加されたエントリ)が保持されていますか?そうでない場合は、DISTINCT.ToList()に、返される新しいリストの重複した項目の中の最初の項目を保存する方法がありますか?List.Distinct()を使用した場合の結果リスト内のアイテムを返す順

Dim values As List(Of Integer) = New List(Of Integer) 
    values.Add(1) 
    values.Add(5) 
    values.Add(2) 
    values.Add(3) 
    values.Add(2) 
    values.Add(3) 
    values.Add(4) 
    values.Add(2) 
    values.Add(2) 
    values.Add(3) 
    values.Add(3) 
    values.Add(3) 

    Dim items As List(Of Integer) = values.Distinct().ToList 

    ' Display result. 
    For Each i As Integer In items 
     Console.WriteLine(i) 
    Next 

Expected output: 
1 
5 
2 
3 
4 

このMSDNページは述べています "(TSOURCEのIEnumerableを())(TSOURCEの)個別法重複値が含まれていない順不同シーケンスを返します"。これを回避する方法はありますか?

+2

実際、アイテムはリストから削除されず、別個のアイテムを含む新しいリストが返されます。 – hellowstone

+1

あなたはいつでも拡張メソッドを追加できます。 'public static IOrderedEnumerable OrderedDistinct(this IEnumerable data){return data.Distinct()。OrderBy(x => x); } ' – Maarten

+0

' Distinct'操作で返されるリストには、最初に出現した元のアイテムのみが含まれ、順序はありません。したがって、あなたの期待する結果をあなたの例で期待する必要があります。 – hellowstone

答えて

4

いいえあなたはそれを回避するためにDistinctを使用することはできません。それが起こるにつれ、それは期待どおり正確に動作しますが、ドキュメンテーションは保証されていないことを明示的に述べています。したがって、フレームワークの将来のバージョンで実装が変更される可能性があります。この方法は簡単に書くことができます。実際にはthe framework implementationをコピーすることもできます。

もう一度やり直してください。あなたの希望どおりに動作しますが、将来は保証されません。

一方、私は、実装がより効率的な実装が存在するとは想像もできないほど変わらないと確信しています。ここで

なしあなたは、フレームワークが提供する標準的な方法でそれを回避することはできません

public static class MyEnumerable 
{ 
    public static IEnumerable<T> Distinct<T>(this IEnumerable<T> source) 
    { 
     if (source == null) 
     { 
      throw new ArgumentNullException(nameof(source)); 
     } 

     var items = new HashSet<T>(); 

     foreach (T item in source) 
     { 
      if (items.Add(item)) 
      { 
       yield return item; 
      } 
     } 
    } 
} 
1

(申し訳ありません、それはC#とVB.NETではないのです)、完全性のために実装したものです。あなたはStilgarのようにそれを自分でコーディングして周りを回ることができます。

例では、インデックスで最初のアイテムを選択することは、Intが構造体であるためリスト内の最初または100番目のオカレンスかどうかを知ることができないため、技術的には関係ありません。

しかし、私はあなたがカスタムオブジェクトを使用していると推測しています。その場合、あなたの注文は何らかの並べ替えから来ます。その場合は代わりにGroupBy<>を使用し、次に各グループに対してOrderBy<>文で項目を注文し、その上にFirst<>を実行することをお勧めします。

グループBy and Distinctは非常に近いです。 distinctは、グループごとに、次にグループごとに最初に置き換えることができます。確かに実際の実装よりもはるかに遅いですが、ここでの目標は、最終的には最初の項目以上を必要とする場合に出力をカスタマイズする方法を説明することです。

関連する問題