そこにリストのリスト があるとすると、すべてのリストに 0 個以上のアイテムが含まれている可能性がありますが、必ずしもすべて同じ数であるとは限りません。そして、リスト内のすべてのアイテムを含むリストが必要です...しかし、順序を次のようにしたいと思います。最初に、すべてのリストの最初のアイテムから、それらが「スーパーリスト」に表示されるようにします。List
<List<T>>
元。
List[0] = { 'Apple', 'Blueberry', 'Cranberry' }
List[1] = { 'Anteater', 'Baboon', 'Camel', 'Dodo'}
List[2] = { 'Albatross', 'Blackbird', 'Chicken'}
result = { 'Apple', 'Anteater', 'Albatross', 'Blueberry', 'Baboon',
'Blackbird', 'Cranberry', 'Camel', 'Chicken', 'Dodo' }
(これはアルファベット順ではないことに注意してください。ブルーベリーがヒヒの前になります)
もちろん、空でないリストがある限り、カウンターを使用して「スーパーリスト」をループし、結果リストに項目を 1 つずつ追加することもできます。
int i = 0;
bool done = false;
while (!done)
{
bool found = false;
foreach (list l in superlist)
{
if (l.Count() > i)
{
found = true;
result.Add(l[i]);
}
}
i++;
if (!found)
done = true;
}
ただし、これを行うには、最適化された LINQ 関数を使用する方がはるかに優れています。私はZip、GroupBy、およびAggregateを調べてきましたが、それらを機能させることができませんでした。
だから:これをきれいなコードに変えるきれいなLINQ関数、または複数の組み合わせはありますか、それとも現在の関数に固執する(そしておそらく最適化する)必要がありますか?
編集:単純な SelectMany(x => x) も、私のアルゴリズムのように折りたたむのではなく、リストの順序を保持するため、うまくいきません。詳細については、私の最初の質問を参照してください。