params object[]
でなんでも受けようとすると、配列以外の配列っぽいものはソレそのものが単一の object
として入ってきます。
void PrintToConsole(params object[] values) => string.Join(", ", values);
var array = new string[] { "A", "B", "C" };
var list = new List<string>(array);
var linq = array.Where(x => true);
var linq2 = array.FirstOrDefault();
PrintToConsole(array); // A, B, C
PrintToConsole(list); // System.Collections.Generic.List`1[System.String]
PrintToConsole(linq); // System.Linq.Enumerable+WhereArrayIterator`1[System.String]
PrintToConsole(linq2); // A
ココから ToArray()
が必要な LINQ と List だけを選ぶには 👇
values[0] is |
IEnumerable |
IEnumerator |
ICollection |
|
---|---|---|---|---|
string |
〇 | × | × | 文字列が IEnumerable |
List<string> |
〇 | × | 〇 | お前 IEnumerator 無いんか |
LINQ (Where) |
〇 | 〇 | × | モノによって型が違う問題 |
IEnumerator
か ICollection
のどちらか。
ただし、これらを実装した List/Linq 以外の何かが来たら終わる。IToArrayable
の登場が待たれる。
--
見直すと IEnumerable
で string
では無いものは foreach
なり何なりが一番良さそう。
--
そもそも params object[]
なんて使わない方が良いんでしょうね。でも雑で良い部分で使うには便利なんだよなー。
以上です。お疲れ様でした。