145

XML から次のアイテム セットがあります。

id           category

5            1
5            3
5            4
5            3
5            3

これらのアイテムの明確なリストが必要です:

5            1
5            3
5            4

LINQでCategory AND Idも区別するにはどうすればよいですか?

4

7 に答える 7

230

複数のフィールドで区別しようとしていますか? その場合は、匿名型と Distinct 演算子を使用するだけで問題ありません。

var query = doc.Elements("whatever")
               .Select(element => new {
                             id = (int) element.Attribute("id"),
                             category = (int) element.Attribute("cat") })
               .Distinct();

「より大きな」型の個別の値のセットを取得しようとしているが、個別の側面のプロパティのサブセットのみを調べている場合は、おそらくMoreLINQDistinctBy実装として次のようにする必要があります。DistinctBy.cs

 public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
     this IEnumerable<TSource> source,
     Func<TSource, TKey> keySelector,
     IEqualityComparer<TKey> comparer)
 {
     HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
     foreach (TSource element in source)
     {
         if (knownKeys.Add(keySelector(element)))
         {
             yield return element;
         }
     }
 }

(比較子として渡した場合null、キーの型にデフォルトの比較子が使用されます。)

于 2009-06-15T20:02:38.267 に答える
34

Distinct()独自の比較子で使用するだけです。

http://msdn.microsoft.com/en-us/library/bb338049.aspx

于 2009-06-15T20:03:14.477 に答える
27

Jon Skeet の回答に加えて、group by 式を使用して、グループの反復ごとにカウントされた一意のグループを取得することもできます。

var query = from e in doc.Elements("whatever")
            group e by new { id = e.Key, val = e.Value } into g
            select new { id = g.Key.id, val = g.Key.val, count = g.Count() };
于 2009-06-15T20:10:56.520 に答える
4
// First Get DataTable as dt
// DataRowComparer Compare columns numbers in each row & data in each row

IEnumerable<DataRow> Distinct = dt.AsEnumerable().Distinct(DataRowComparer.Default);

foreach (DataRow row in Distinct)
{
    Console.WriteLine("{0,-15} {1,-15}",
        row.Field<int>(0),
        row.Field<string>(1)); 
}
于 2012-03-12T09:44:09.440 に答える