2

linq を使用してリストから重複を選択し、各配列に重複が含まれる配列のリストを返す必要があります。たとえば、私のリストが

{2,2,3,13,4,4,15,5,7,8,9,12,13}

それから私は返される必要があります

{2,2},{4,4}

次のコードは、重複ごとに単一の値のみを返します

int[] listOfItems = new[] {2,2,3,13,4,4,15,5,7,8,9,12,13};
var duplicates = listOfItems
    .GroupBy(i => i)
    .Where(g => g.Count() > 1)
    .Select(g => g.Key);
foreach (var d in duplicates)
    Console.WriteLine(d);

これにより、以下が生成されます。

4
2
4

3 に答える 3

6

これが問題です。

    .Select(g => g.Key)

キーを明示的に選択しているだけです。

その呼び出しを削除すると、代わりにすべてのグループが選択されます-が表示されますIEnumerable<IGrouping<int, int>>。もちろん、出力も変更する必要があります。例えば:

foreach (var group in duplicates)
{
    Console.WriteLine("{{{0}}}", group.Join(","));
}

編集:List<int[]>あなたはただ必要です:

var duplicates = listOfItems
    .GroupBy(i => i)
    .Where(g => g.Count() > 1)
    .Select(g => g.ToArray())
    .ToList();
于 2012-08-14T07:32:21.367 に答える
2

行を削除するだけ.Select(g => g.Key)で、基本的にネストされた列挙可能オブジェクトが作成されます。

int[] listOfItems = new[] {2,2,3,13,4,4,15,5,7,8,9,12,13};
var duplicates = listOfItems
    .GroupBy(i => i)
    .Where(g => g.Count() > 1);

foreach (var g in duplicateGroups)
{
    foreach (var d in g)
    {
        Console.WriteLine(d); 
    }
    Console.WriteLine();
}

配列のリストが必要な場合は、

var listOfArrays = duplicates.Select(g => g.ToArray()).ToList();

同様に

var listOfLists = duplicates.Select(g => g.ToList()).ToList();
var arrayOfLists = duplicates.Select(g => g.ToArray()).ToList();
var arrayOfArrays = duplicates.Select(g => g.ToArray()).ToArray();
于 2012-08-14T07:32:40.253 に答える
0

より簡単な代替手段は次のとおりです。

listOfItems
    .ToLookup(x => x)
    .Where(x => x.Skip(1).Any());
于 2012-08-14T07:58:05.983 に答える