문제

안녕.

이것이 제가하고 싶은 일입니다.

    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]);
    }

그러나 대신 필요한 모든 것을 할 수있는 쿼리를 원합니다.

내가 원하는 것을 만들기 위해 수율을 사용하는 나만의 열거 자 메소드를 만들어야합니까?

편집 : 요청 당 : 내가 할 수있는 일의 예 :

    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과 같은 Sugarcoated Syntax로 이것을 가져올 수있게되면 나는 감격 할 것입니다. 메소드 체인 대신에.

도움이 되었습니까?

해결책

당신이 사용할 수있는:

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' });

다른 팁

열거 가능.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);
            }
        }
    }
}

사용 열거 가능 .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);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top