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

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

【技術書メモ】配列とList<T>の操作まとめ

普段めちゃめちゃよく使う、配列とList。これは自分だけかも知れないが、普段の仕事で書くコードにあまり配列を使わない印象がある。Listの使用率が圧倒的に多い。
けど、配列が使えないと困る部分はあるので、一緒にまとめていく。

配列あるいはListに同じ値を設定する

あまり使用頻度が少なそうだが、同じ値の要素をもったリスト、配列の作り方。

// -1が20個あるリスト
var numbers = Enumerable.Repeat(-1, 20).ToList();

// -1が20個ある配列
var numbers = Enumerable.Repeat(-1, 20).ToArray();

ちなみに、-1を20個要素にもったリストを作ろうとすると、以下のように書く。
うん、これはだるい。

var numbers = new List<int> {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, };

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

ここからのやつは、かなり出番がありそう。

// 1から20まで連続した値をもったリスト
var list = Enumerable.Range(1, 20).ToList();

// 1から20まで連続した値をもった配列
var array = Enumerable.Range(1, 20).ToArray();

平均値を求める

こっから、よく使うやつたちです。

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

合計を求める

var sum = numbers.Sum();

最小値、最大値を得る

var min = numbers.Min();
var max = numbers.Max();

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

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

条件に一致する要素があるか調べる

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

すべての要素が条件を満たしているか調べる

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

2つのコレクション(リストや配列など)の要素が等しいか調べる

bool equal = numbers1.SequenceEqual(numbers2);

条件に一致する最初 / 最後の要素を取得する

var text = "The quick brown fox jumps over the lazy dog";
var words = text.Split(' ');

// 文字列overが取り出される
var word = words.FirstOrDefault(x => x.Length == 4);

// 文字列lazyが取り出される
var word = words.LastOrDefault(x => x.Length == 4);

条件に一致する最初 / 最後のインデックスを求める

var numbers = new List<int> { 9, 7, -5, -4, 2, 5, 4, 0, -4, };
// 戻り値は2
var firstIndex = numbers.FindIndex(n => n < 0);
// 戻り値は8
var lastIndex = numbers.FindLastIndex(n => n < 0);

条件を満たしている間だけ要素を取り出す

これはちょっとつまづいたので、説明を入れる。TakeWhileメソッドを使えば、引数に与えた条件を満たしている間の要素を取り出せる。しかし、先頭から順番に条件に当てはまるか調べるが、先頭がすでに条件から外れていたら、その時点で処理をストップする。だから、以下コードのようになる。

var numbers = new List<int> { 9, 7, -5, -4, 2, 5, 4, 0, -4, };
// 9, 7を取り出す
var selected = numbers.TakeWhile(x => x > 0);

// 何も取り出さない
var selected = numbers.TakeWhile(x => x < 0);

条件を満たしている間は要素を読み飛ばす

今度は、条件を満たしている間は要素を読み飛ばす。ただ、先頭が条件に合わないと処理がストップする動きは同じ。

var numbers = new List<int> { 9, 7, -5, -4, 2, 5, 4, 0, -4, };
// -5, -4, 2, 5, 4, 0, -4を取り出す
var selected = numbers.SkipWhile(x => x > 0);

// 9, 7, -5, -4, 2, 5, 4, 0, -4を取り出す
var selected = numbers.SkipWhile(x => x < 0);

リストの重複を排除する

var numbers = new List<int> { 9, 7, -5, -4, 2, 5, 4, 0, -4, };
var result = numbers.Distinct();

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

この並び替えは、めちゃめちゃ使うと思う。かなり重要。

// 昇順にソート
var numbers = new List<int> { 9, 7, -5, -4, 2, 5, 4, 0, -4, };
var selected = numbers.OrderBy(x => x).ToList();
selected.ForEach(Console.WriteLine);

// 降順にソート
var selected = numbers.OrderByDescending(x => x);

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

var numbers1 = new List<int> { 9, 7, -5, -4, 2, 5, 4, 0, -4, };
var numbers2 = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, };

var all = numbers1.Concat(numbers2).ToList();
all.ForEach(Console.WriteLine);

ここに書いたものが、すっと出てくるようになれば競プロもだいぶ解けるようになるんじゃないかと思う。反復あるのみですね。
配列とList、完璧に理解した。