HI
这就是我想要做的事情:
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' });
我想在实际查询中反向等。所以我把它全部收集起来。 额外:能够使用类似sql的糖涂层语法来提取它,我会很激动。而不是方法链,即。
答案 0 :(得分:3)
我的另一个答案没有那么有用,因为在版本4中添加了Enumerable.Zip函数。
所以,这是如何推销自己的:
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);
}
}
}
}
答案 1 :(得分:1)
使用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);
}
到
str2 = "91";
str1 = "19";
var strings = Enumerable.Zip(c1, c2, (a, b) => a + " | " + b);
foreach (var str in strings)
{
Console.WriteLine(str);
}
答案 2 :(得分:1)
您可以使用:
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' });