Pergunta

HI.

Isto é o que eu quero fazer:

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

O que eu quero:

9 | 1
1 | 9

O que eu realmente obter:

1 | 9
1 | 1
9 | 9
9 | 1

O código é um exemplo puro. Pode iterar arrays ou alguma outra coleção. Ele também irá fazer algumas outras coisas, mas eles são irrelevantes para este problema.

Sem linq, eu poderia fazer algo parecido com isto:

    for (int i = 0; i < str1.Length -1; i++)
    {
        Console.WriteLine(str1[i] + " | " + str2[i]);
    }

Mas eu quero uma consulta que pode fazer tudo o que preciso em seu lugar.

Eu realmente tenho para criar o meu próprio método enumerador que usos deu para criar o que eu quero?

EDIT: por solicitação: Um exemplo do que eu gostaria de ser capaz de fazer:

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

Eu gostaria de puxar o etc. inversa na consulta real. Então, eu mantê-lo todos reunidos. Extra: Ser capaz de puxar esta com o tipo SQL sintaxe sugarcoated, eu ficaria feliz. Em vez de uma cadeia de método, isto é.

Foi útil?

Solução

Você pode usar:

var testQuery = str1.Select( (c,i) => new {c, str2[i]} );

Editar:

Dada a sua nova pergunta, você deve ser capaz de fazer:

var q = str1.Reverse().Select((c1, i) => new { c1 = c1 - '0', c2 = str2[str2.Length - i - 1] - '0' });

Outras dicas

A minha outra resposta é menos útil do que poderia ser, porque a função Enumerable.Zip foi adicionado na versão 4.

Então, aqui está como rolar o seu próprio:

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

Use Enumerable.Zip . Seu primeiro exemplo pode ser reescrito de:

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

para

str2 = "91";
str1 = "19";
var strings = Enumerable.Zip(c1, c2, (a, b) => a + " | " + b);
foreach (var str in strings)
{
    Console.WriteLine(str);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top