転職を繰り返したサラリーマンの多趣味ブログ

30才未経験でSEに転職した人の多趣味ブログ

【技術書メモ】C#プログラミングのイディオム / 定石&パターン⑥

今回は、配列とListの操作です。
配列とListは似たところがあるけど、自分はほぼListしか使わないかも。配列の使い所がわからない。
この章ではLINQのさらに詳しい使い方も説明してくれるらしいので、頑張ります。

要素の設定

配列あるいは、Listを同じ値で埋める。

// List<T>(要素数:20個)の値を-1で埋める
var numbers = Enumerable.Repeat(-1, 20).ToList();

// 配列(要素数:12個)の値をunknownで埋める
var strings =  Enumerable.Repeat("(unknown)", 12).ToArray();


配列あるいは、Listに連続した値を設定する。

// 配列に1〜20の値を設定
var array = Enumerable.Range(1, 20).ToArray();

コレクションの集計

平均値の求め方。

var numbers = new List<int>{9, 7, 5, 4, 2, 5, 4, 0, 4, 1, 0, 4};
var average = numbers.Average();

// 合計の求め方
var sum = numbers.Sum();


最小値、最大値の求め方。

var numbers = new List<int>{9, 7, 5, 4, 2, 5, 4, 0, 4, 1, 0, 4};
var min = numbers.Where(n => n > 0).Min();
var max = numbers.Where(n => n > 0).Max();


条件に一致する要素をカウントする。

var count = numbers.Count(n => n == 0);

コレクションの判定

条件に一致する要素があるかどうか調べる。
Anyメソッドは、条件に一致する要素が見つかった時点で要素の取得を中止する。

bool exists = numbers.Any(n => n % 7 == 0);


コレクション内のすべての要素が条件を満たしているかどうかを調べる。

bool isAllPositive = numbers.All(n => n > 0);


2つのコレクションの要素が等しいか調べる。

bool equal = numbers1.SequenceEqual(numbers2);

単一の要素の取得

条件に一致する最初、または最後の要素を取得する。

var word = words.FirstOrDefault(x => x.Length == 4);
var word = words.LastOrDefault(x => x.Length == 4);


条件に一致する最初、または最後のインデックスを求める。

var index = numbers.FindIndex(n => n < 0);
var index = numbers.FindLastIndex(n => n < 0);

複数の要素の取得

条件を満たす要素をn個取り出す。

var results = numbers.Where(n => n > 0).Take(5);


コレクションの中から、条件を満たしている間だけ要素を取り出す。
例として、400, 281, 389, 637, 411というリストがあった場合、600以下という条件をつけたら、先頭の400、281、389だけ取れるというもの。

var selected = books.TakeWhile(x => x.Price < 600);


では逆に、条件を満たしている間だけ要素を読み飛ばすには、SkipWhile演算子を使う。

var selected = numbers.SkipWhile(n => n >= 0).ToList();

その他の処理

コレクションから別のコレクションを生成する。
基本的には、ToArray()、ToList()メソッドを使用する。

var words = new List<string>{"Microsoft", "Apple", "Google", "Oracle", };
var lowers = words.Select(name => name.ToLower()).ToArray();


重複を排除する。

var result = numbers.Distinct();


コレクションを並び替える。

// 昇順にソート
var sorteBooks = books.OrderBy(x => x.Price);

// 降順にソート
var sortedBooks = books.OrderByDescending(x => x.Price);


2つのコレクションを連結する。

var allfiles = files1.Concat(file2);