XML から次のアイテム セットがあります。
id category
5 1
5 3
5 4
5 3
5 3
これらのアイテムの明確なリストが必要です:
5 1
5 3
5 4
LINQでCategory AND Idも区別するにはどうすればよいですか?
複数のフィールドで区別しようとしていますか? その場合は、匿名型と Distinct 演算子を使用するだけで問題ありません。
var query = doc.Elements("whatever")
.Select(element => new {
id = (int) element.Attribute("id"),
category = (int) element.Attribute("cat") })
.Distinct();
「より大きな」型の個別の値のセットを取得しようとしているが、個別の側面のプロパティのサブセットのみを調べている場合は、おそらくMoreLINQのDistinctBy
実装として次のようにする必要があります。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
、キーの型にデフォルトの比較子が使用されます。)
Distinct()
独自の比較子で使用するだけです。
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() };
// 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));
}