首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否从2个枚举对象创建enumerator<{datatype,datatype}>?

是否从2个枚举对象创建enumerator<{datatype,datatype}>?
EN

Stack Overflow用户
提问于 2009-10-24 08:16:56
回答 3查看 271关注 0票数 1

嗨。

这就是我想要做的:

代码语言:javascript
复制
    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);
    }

我想要的:

代码语言:javascript
复制
9 | 1
1 | 9

我真正理解的是:

代码语言:javascript
复制
1 | 9
1 | 1
9 | 9
9 | 1

该代码是一个纯粹的示例。它可能会遍历数组或其他集合。它还会做一些其他的事情,但它们与这个问题无关。

没有linq,我可以做这样的事情:

代码语言:javascript
复制
    for (int i = 0; i < str1.Length -1; i++)
    {
        Console.WriteLine(str1[i] + " | " + str2[i]);
    }

但是我想要一个可以做我需要的所有事情的查询。

我真的必须创建自己的枚举器方法,使用yield来创建我想要的东西吗?

EDIT: per request:我希望能够做到的示例:

代码语言:javascript
复制
    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的糖衣语法来实现这一点,我会非常激动。而不是方法链。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-24 08:22:20

您可以使用:

代码语言:javascript
复制
var testQuery = str1.Select( (c,i) => new {c, str2[i]} );

编辑:

给出你的新问题,你应该能够做到:

代码语言:javascript
复制
var q = str1.Reverse().Select((c1, i) => new { c1 = c1 - '0', c2 = str2[str2.Length - i - 1] - '0' });
票数 1
EN

Stack Overflow用户

发布于 2009-10-24 08:31:23

我的另一个答案没有那么有用,因为Enumerable.Zip函数是在版本4中添加的。

因此,下面是如何创建自己的代码:

代码语言:javascript
复制
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);
            }
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2009-10-24 08:20:33

使用Enumerable.Zip。您的第一个示例可以从以下内容重写:

代码语言:javascript
复制
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);
}

代码语言:javascript
复制
str2 = "91";
str1 = "19";
var strings = Enumerable.Zip(c1, c2, (a, b) => a + " | " + b);
foreach (var str in strings)
{
    Console.WriteLine(str);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1616554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档