Pregunta

HI.

Esto es lo que quiero hacer:

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

Lo que quiero:

9 | 1
1 | 9

Lo que realmente obtengo:

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

El código es un ejemplo puro. Puede iterar a través de matrices o alguna otra colección. También hará algunas otras cosas, pero son irrelevantes para este problema.

Sin linq, podría hacer algo como esto:

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

Pero quiero una consulta que pueda hacer todo lo que necesito en su lugar.

¿Realmente tengo que crear mi propio método de enumerador que utiliza el rendimiento para crear lo que quiero?

EDITAR: por solicitud: Un ejemplo de lo que me gustaría poder hacer:

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

Me gustaría tirar del revés, etc. en la consulta real. Así que mantengo todo reunido. Extra: Ser capaz de hacer esto con la sintaxis de Sugarcoated tipo SQL, me encantaría. En lugar de una cadena de métodos, es decir.

¿Fue útil?

Solución

Puedes usar:

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

Editar:

Dada tu nueva pregunta, deberías poder hacer:

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

Otros consejos

Mi otra respuesta es menos útil de lo que podría ser, porque la función Enumerable.Zip se agregó en la versión 4.

Por lo tanto, aquí está cómo hacer tu propio rollo:

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

Utilice Enumerable.Zip . Su primer ejemplo puede ser reescrito desde:

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

a

str2 = "91";
str1 = "19";
var strings = Enumerable.Zip(c1, c2, (a, b) => a + " | " + b);
foreach (var str in strings)
{
    Console.WriteLine(str);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top