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}"); } }