私は2つ持っていますIEnumerable
:
IEnumerable<string> first = ...
IEnumerable<string> second = ...
IEnumerable<string>
それぞれの各要素を連結した秒を作成したいと思いますIEnumerable
。
例えば:
IEnumerable<string> first = new [] {"a", "b"};
IEnumerable<string> second = new [] {"c", "d"};
foreach (string one in first)
{
foreach (string two in second)
{
yield return string.Format("{0} {1}", one, two);
}
}
これにより、次のものが生成されます。
"a c"; "a d"; "b c"; "b d";
問題は、2つIEnumerable
のsのうちの1つが空である場合があることです。
IEnumerable<string> first = new string[0];
IEnumerable<string> second = new [] {"c", "d"};
この場合、ネストされたforeach
構成はyield return
ステートメントに到達しません。どちらかIEnumerable
が空の場合、結果を空でないもののリストにしますIEnumerable
。
探している組み合わせをどのように作成できますか?
編集:実際には、私がIEnumerable
組み合わせようとしている3つの異なるものがあるので、空のすべての可能な順列の条件を追加するのIEnumerable
は悪いようです。それが唯一の方法であるなら、私はそれをそのようにしなければならないと思います。
Enumerable.DefaultIfEmpty()
アイテムがない場合でも、単にコレクションを列挙するために使用します。
IEnumerable<string> first = new string[0];
IEnumerable<string> second = new[] { "a", "b" };
IEnumerable<string> third = new[] { "c", null, "d" };
var permutations =
from one in first.DefaultIfEmpty()
from two in second.DefaultIfEmpty()
from three in third.DefaultIfEmpty()
select String.Join(" ", NotEmpty(one, two, three));
注:私String.Join
は、nullまたは空ではないアイテムを結合し、結合する空でないアイテムを選択する方法を使用しました(別のメソッドが必要ない場合は、このコードをインライン化できます)。
private static IEnumerable<string> NotEmpty(params string[] items)
{
return items.Where(s => !String.IsNullOrEmpty(s));
}
上記のサンプルの出力は
[ "a c", "a", "a d", "b c", "b", "b d" ]
2つのコレクションとforeachループの場合(上記のようにLINQを使用することをお勧めします):
IEnumerable<string> first = new[] { "a", "b" };
IEnumerable<string> second = new string[0];
foreach(var one in first.DefaultIfEmpty())
{
foreach(var two in second.DefaultIfEmpty())
yield return $"{one} {two}".Trim(); // with two items simple Trim() can be used
}
出力:
[ "a", "b" ]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加