どうも、ちょげ(@chogetarou)です。
List(リスト)から重複する要素とその個数を抽出する方法を紹介します。
方法

List(リスト)から重複する要素とその個数を抽出する方法は、2つあります。
ToList()
1つは、ToList()を使う方法です。
まず、System.Linqを導入します。
using System.Linq;
次に、リスト(List)からGroupBy()を呼び出します。
GroupBy()の引数に、引数をそのまま返すラムダ式を指定します。
GroupBy()からWhere()を呼び出し、Where()のラムダ式で「引数.Count() > 1」を返します。
そして、Where()からSelect()を呼び出します。
Select()の引数に、引数のKeyプロパティとCount()をまとめたオブジェクトを返すラムダ式を指定します。
Select()からToList()を呼び出します。
var duplicates = list.GroupBy(x => x)
.Where(x => x.Count() > 1)
.Select(x => new { Item = x.Key, Count = x.Count() })
.ToList();
上記のToList()は、リストから重複する要素とその個数を抽出したリストを返します。
使用例
using System;
using System.Linq;
using System.Collections.Generic;
public class Example
{
public static void Main()
{
List<int> numbers = new List<int>() { 1, 2, 3, 1, 1, 4, 3, 5 };
var duplicates = numbers.GroupBy(x => x)
.Where(x => x.Count() > 1)
.Select(x => new { Item = x.Key, Count = x.Count() })
.ToList();
Console.WriteLine(String.Join("\n", duplicates));
}
}

ToDictionary()
もう1つは、ToDictionary()を使う方法です。
まず、System.Linqを導入します。
using System.Linq;
次に、リスト(List)からGroupBy()を呼び出します。
GroupBy()の引数に、引数をそのまま返すラムダ式を指定します。
GroupBy()からWhere()を呼び出し、Where()のラムダ式で「引数.Count() > 1」を返します。
そして、Where()からToDictionary()を呼び出します。
Select()の引数に、第1引数に引数のKeyプロパティを返すラムダ式、第2引数に引数のCount()を返すラムダ式を指定します。
var duplicates = list.GroupBy(x => x)
.Where(x => x.Count() > 1)
.ToDictionary(x => x.Key, y => y.Count());
上記のToDicationary()は、リストから重複する要素とその個数を抽出した辞書を返します。
使用例
using System;
using System.Linq;
using System.Collections.Generic;
public class Example
{
public static void Main()
{
List<int> numbers = new List<int>() { 1, 2, 3, 1, 1, 4, 3, 5 };
var duplicates = numbers.GroupBy(x => x)
.Where(x => x.Count() > 1)
.ToDictionary(x => x.Key, y => y.Count());
Console.WriteLine(String.Join(",", duplicates)); //[1, 3],[3, 2]
}
}
まとめ
List(リスト)から重複する要素とその個数を取得する方法は、次の2つです。
- ToList()を使う方法
- ToDictionary()を使う方法
コメント