重複している List データを抽出・グループ化する

List<string>List<int> は結構記事を見かけるのですが、クラスにたいしては意外と少ないので例をあげておきます。
(といっても、それほど特別なことをする必要はありません)

データサンプル

public class Row
{
    public int ID;
    public string Name;
}

List<Row> rows = new List<Row>();
rows.Add( new Row() { ID =  1, Name = "01_01" });
rows.Add( new Row() { ID =  2, Name = "01_01" });
rows.Add( new Row() { ID =  3, Name = "01_01" });
rows.Add( new Row() { ID =  4, Name = "01_01" });
rows.Add( new Row() { ID =  5, Name = "01_01" });
rows.Add( new Row() { ID =  6, Name = "01_01" });
rows.Add( new Row() { ID =  7, Name = "01_01" });
rows.Add( new Row() { ID =  8, Name = "01_02" });
rows.Add( new Row() { ID =  9, Name = "01_03" });
rows.Add( new Row() { ID = 10, Name = "01_03" });
rows.Add( new Row() { ID = 11, Name = "01_03" });

データを抽出する

01_01、01_02、01_03 だけ取得したいのですが、01_01 と 01_03 はデータが重複しているので、一件だけ抽出したい。
こういった場合、HashSet を使うと便利です。

HashSet は重複しないよう、キー値を保存することができます。

var names = new HashSet<string>();
rows.ForEach( e => names.Add(e.Name) );

foreach (var name in names)
{
    UnityEngine.Debug.Log(name);               // unity
    System.Diagnostics.Debug.WriteLine(name);  // C#
}

グループごとの行データも確認したい場合

グループごとにデータを分け、後で1行1行取り出す必要があればこちら。
表示確認のコードが長いですが、実際の処理は1行で済みます。

抽出にくらべて負荷が高いので、乱用は控えましょう。

var groupRows = rows.GroupBy(e => e.Name).Select(e => e).ToList();

foreach (var groupRow in groupRows)
{
    // グループ
    Debug.Log(groupRow.Key);
    foreach (var row in groupRow)
    {
        // グループごとのデータ
        Debug.Log($"{groupRow.Key}: {row.ID}");
    }
}

返信を残す

メールアドレスが公開されることはありません。

CAPTCHA