LoginSignup
22
22

More than 3 years have passed since last update.

【C#】List中の重複する要素を抽出する方法

Last updated at Posted at 2019-01-30

「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
22
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
22