次のクエリについて考えてみます。
var ds = (from t1 in list1
from t2 in list2
select new {t1.Name, t2.Name}
).ToList();
これは次のようなものを返します:(大まかな表現)
Name1, InnerName1
Name1, InnerName2
Name2, InnerName1
Name2, InnerName2
私が取得したいのは:
Name1, InnerName1
Null, InnerName2
Name2, InnerName1
Null, InnerName2.
つまり、私はリストにすでにt1.Nameを持っている場合、私は、T1の結果の残りの部分にnullまたは空の文字列をたいと思います。
結果をループできることはすでに知っていますが、これをデータソースとして使用しており、セットベースで何かを実行したいと考えています。
単一のクエリでこれを達成する方法はありますか?
Linq-to-Objectsを使用していると仮定すると、次のようなことができます。
string previous = null;
var results =
(from t1 in list1
from t2 in list2
select new {
Name1 = (previous == t1.Name) ? null : (previous = t1.Name),
Name2 = t2.Name
})
.ToList();
しかし、それは副作用に依存しており、特にエレガントではありません。あなたはこのようなものを好むかもしれません:
var result =
(from t1 in list1
select
list2.Take(1)
.Select(t2 => new { Name1 = t1.Name, Name2 = t2.Name })
.Concat(list2.Skip(1)
.Select(t2 => new { Name1 = (string)null, Name2 = t2.Name }))
.SelectMany(x => x)
.ToList();
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加