「Listから重複した要素を削除する時」はDistinctメソッド、「引数で指定した要素がList中に存在するかをチェックする時」はContainsメソッドが使われます。
ですが、これらのメソッドでは「List中の重複する要素を抽出する時」には対応できないため、LINQの機能を活用して処理を考えてみました。
例えば「読み込んだデータ中に重複があるかどうかをチェックしつつ、どのデータが重複しているのかを知りたい」といった時には、以下のコードが役に立つかもしれません。
コード
ListUtils.cs
public class ListUtils
{
/// <summary>
/// 引数のリスト(何らかの名称のリスト)から、重複する要素を抽出する。
/// </summary>
/// <param name="list">何らかの名称のリスト。</param>
/// <returns>重複している要素のリスト。</returns>
public static List<string> FindDuplication(List<string> list)
{
// 要素名でGroupByした後、グループ内の件数が2以上(※重複あり)に絞り込み、
// 最後にIGrouping.Keyからグループ化に使ったキーを抽出している。
var duplicates = list.GroupBy(name => name).Where(name => name.Count() > 1)
.Select(group => group.Key).ToList();
return duplicates;
}
}
コードの実行
テストコード
- テストには、"Tokyo"と"Yokohama"が重複しているリストを使っています。
UnitTestListUtils.cs
[TestClass]
public class UnitTestListUtils
{
[TestMethod]
public void TestMethod1()
{
// "Tokyo"と"Yokohama"が重複しているリスト
List<string> cityNames = new List<string>() {
"Tokyo", "Osaka", "Yokohama", "Nagoya", "Kobe",
"Tokyo", "Yokohama", "Sapporo", "Fukuoka", "Tokyo"};
var duplicates = ListUtils.FindDuplication(cityNames);
System.Console.WriteLine(string.Join(",", duplicates));
}
}
テストコードの実行結果
- 重複している"Tokyo"と"Yokohama"が出力されました。
Tokyo,Yokohama