|
★配列を使う
var records = csvReader.GetRecords<ReadRecord>().ToArray();
var checks = new bool[records.Length];
for (var i = 0; i < records.Length; i++)
{
for (var j = i + 1; j < records.Length; j++)
{
if (checks[j] == false)
{
if (records[i].number == records[j].number)
{
checks[j] = true;
Console.WriteLine("{0} => {1}", records[i].number, records[j].number);
}
}
}
}
★Linqを使う
var records = csvReader.GetRecords<ReadRecord>();
var groups = records.GroupBy(record => record.number);
foreach (var group in groups)
{
if (group.Count() > 1)
{
foreach (var record in group)
{
Console.WriteLine("{0} => {1}", group.Key, record.number);
}
}
}
★Dictionaryを使う
public static class DictionaryExtension
{
public static void addList<K, V>(this Dictionary<K, List<V>> self, K key, V value)
{
List<V> valueList;
if (self.TryGetValue(key, out valueList) == false)
{
valueList = new List<V>();
self.Add(key, valueList);
}
valueList.Add(value);
}
}
var records = csvReader.GetRecords<ReadRecord>();
var groups = new Dictionary<string, List<ReadRecord>>();
foreach (var record in records)
{
groups.addList(record.number, record);
}
foreach (var group in groups)
{
if (group.Value.Count > 1)
{
foreach (var record in group.Value)
{
Console.WriteLine("{0} => {1}", group.Key, record.number);
}
}
}
といった感じで実装はいくつかありそうですね。
データが十分に少なくて行番号を出力したいんだぜといったときは配列をぐるぐる。
データがそれなりにあるときはLinqやDictionaryを使うやり方やJittaさんが紹介されたソートするやり方。
Linqは実質的にGroupByのメソッド呼ぶだけなので超簡単。
というように状況に応じて使い分けるのがいんじゃないでしょうか。
|