うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【C#】Linq で利用できるメソッド一覧

https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.defaultifempty?view=netcore-3.1

上記からよく使いそうなメソッドをまとめました

Any

条件を満たすかどうか
引数がない場合は要素の中が空かどうか

// 空かどうか
list.Any();

// 5以上があるかどうか
list.Any(i => i > 5);
All

すべてが条件を満たすかどうか

// すべてが5以上かどうか
list.All(i => i >= 5);
Append

要素の最後に追加する
この際にはコピーが作成される

// 最後に10を追加する
list.Append(10);
Average

平均を求める

var list = new List<int>(){10, 5, 15};
// 10
list.Average();
Cast

型を変換する

var list = new List<int>{1, 2, 3, 4};
// Float に変換
list.Cast<float>();
Concat

配列の結合

var list1 = new List<int>{1, 2, 3, 4};
var list2 = new List<int>{5, 6};
list1.Concat(list2);
Contains
// 配列に2が含まれているかどうか
list.Contains(2);
Count

配列の要素数

var list = new List<int>{1, 2, 3, 4};
// 4
list.Count();
Where

条件を満たすもの取得する

list.Where(i => i > 5);
First

最初に条件を満たすものを取得する

list.First(i => i > 5);

満たすものが無い場合エラーになるので注意 InvalidOperationException: Sequence contains no matching element

FirstOrDefault

最初に条件を満たすものを取得する
条件を満たすものがなかった場合 primitive型であれば default
クラスであれば null が取得できる

var intList = new List<int>(){0, 1};
intList.FirstOrDefault(i => i > 5); // 0
 
var classList = new List<Test>(){new Test(0), new Test(1)};
classList.FirstOrDefault(i => i.Value > 5); // null
 
private class Test
{
    public int Value;
    public Test(int v)
    {
        Value = v;
    }
}
GroupBy

Key を指定してグループ化できる

var list = new List<Vector3Int>()
{
    Vector3Int.one, Vector3Int.zero, Vector3Int.up
};

// .x の値でグループ化する
var group = list.GroupBy(l => l.x);

// foreach で回す場合はこう記述する
foreach (var g in group)
{
    // g.Key
    foreach (var value in g)
    {
        // check value
    }
}
Last

最後に条件を満たすものを取得する

list.Last(i => i > 5);

満たすものが無い場合エラーになるので注意 InvalidOperationException: Sequence contains no matching element

LastOrDefault

最後に条件を満たすものを取得する
条件を満たすものがなかった場合 primitive型であれば default
クラスであれば null が取得できる

var intList = new List<int>(){0, 1};
intList.FirstOrDefault(i => i > 5); // 0
 
var classList = new List<Test>(){new Test(0), new Test(1)};
classList.FirstOrDefault(i => i.Value > 5); // null
 
private class Test
{
    public int Value;
    public Test(int v)
    {
        Value = v;
    }
}
Max

最大値を取得する

var intList = new List<int>(){0, 1};
intList.Max();

// StructやClassの場合はどの値かを指定できる
var vectorList = new List<Vector2>(){Vector2.one, Vector2.zero};
vectorList.Max(v => v.x);
Min

最小値を取得する

var intList = new List<int>(){0, 1};

intList.Min();

// StructやClassの場合はどの値かを指定できる
var vectorList = new List<Vector2>(){Vector2.one, Vector2.zero};
vectorList.Min(v => v.x);
OrderBy

昇順に並べ替える

var intList = new List<int>(){0, 1};
intList.OrderBy(v => v);
OrderByDescending

降順に並べ替える

var intList = new List<int>(){0, 1};
intList.OrderByDescending(v => v);
Reverse

並びを逆にする

var intList = new List<int>(){0, 1};
// 1, 0
intList.Reverse();
Select

指定した要素を取得する

var vectorList = new List<Vector2>(){Vector2.one, Vector2.zero};
// Vector3Int の X だけの要素にする
var xList = vectorList.Select(v => v.x);
Skip

指定した数スキップする

// 先頭から4要素スキップする
list.Skip(4);
Take

指定した数取得する
要素が足りない場合は取得できる分だけ

// 先頭から4要素取得する
list.Take(4);
SkipWhile

条件を満たす間スキップする

// 3以上の値が来るまでスキップする
list.SkipWhile(i => i < 3)
TakeWhile

条件を満たすまで取得する

// 3以上の値が来るまで取得する
list.SkipWhile(i => i < 3)
Sum

合計値を取得する

var intList = new List<int>(){1, 10};
intList.Sum();

// StructやClassの場合はどの値かを指定できる
var vectorList = new List<Vector2>(){Vector2.one, Vector2.zero};
vectorList.Sum(v => v.x);