列挙子を作成< {datatype、datatype}> 2つの列挙型から?
-
06-07-2019 - |
質問
こんにちは。
これは私がやりたいことです:
str2 = "91";
str1 = "19";
var testQuery = from c1 in str1
from c2 in str2
select new {c1, c2};
foreach (var enumerable in testQuery)
{
Console.WriteLine(enumerable.c1 + " | " + enumerable.c2);
}
私が欲しいもの:
9 | 1
1 | 9
私が本当に得たもの:
1 | 9
1 | 1
9 | 9
9 | 1
コードは純粋な例です。配列またはその他のコレクションを反復処理する場合があります。他にもいくつかのことを行いますが、この問題とは無関係です。
linqがなければ、次のようなことができます:
for (int i = 0; i < str1.Length -1; i++)
{
Console.WriteLine(str1[i] + " | " + str2[i]);
}
しかし、代わりに必要なすべてを実行できるクエリが必要です。
yieldを使用して必要なものを作成する独自の列挙子メソッドを実際に作成する必要がありますか?
編集:リクエストごと: 私ができることの例:
str1 = "91";
str2 = "19";
char[] digitX = str1.ToString().Reverse().ToArray();
char[] digitY = str2.ToString().Reverse().ToArray();
var q = digitX.Select((c1, i) => new {c1 = c1 - '0', c2 = digitY[i] - '0' });
実際のクエリでリバースなどを引き出したいです。だから私はそれをすべて集めておく。 Extra:sqlのようなsugarcoated構文を使用してこれを引き出すことができるので、ワクワクします。メソッドチェーンの代わりに、つまり。
解決
次を使用できます:
var testQuery = str1.Select( (c,i) => new {c, str2[i]} );
編集:
新しい質問があれば、次のことができるはずです。
var q = str1.Reverse().Select((c1, i) => new { c1 = c1 - '0', c2 = str2[str2.Length - i - 1] - '0' });
他のヒント
他の答えは、Enumerable.Zip関数がバージョン4で追加されたため、あまり有用ではありません。
だから、ここにあなた自身をロールバックする方法があります:
public static class EnumerableExtensions
{
public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(
IEnumerable<TFirst> first,
IEnumerable<TSecond> second,
Func<TFirst, TSecond, TResult> resultSelector)
{
using(var firstEnum = first.GetEnumerator())
using(var secondEnum = second.GetEnumerator())
{
while(firstEnum.MoveNext() && secondEnum.MoveNext())
{
yield return resultSelector(firstEnum.Current, secondEnum.Current);
}
}
}
}
Enumerable.Zip を使用します。最初の例は次の場所から書き直すことができます。
str2 = "91";
str1 = "19";
var testQuery = from c1 in str1
from c2 in str2
select new {c1, c2};
foreach (var enumerable in testQuery)
{
Console.WriteLine(enumerable.c1 + " | " + enumerable.c2);
}
to
str2 = "91";
str1 = "19";
var strings = Enumerable.Zip(c1, c2, (a, b) => a + " | " + b);
foreach (var str in strings)
{
Console.WriteLine(str);
}
所属していません StackOverflow