Domanda

HI.

Questo è quello che voglio fare:

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

Quello che voglio:

9 | 1
1 | 9

Cosa ottengo davvero:

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

Il codice è un puro esempio. Potrebbe scorrere attraverso array o altre raccolte. Farà anche altre cose, ma sono irrilevanti per questo problema.

Senza linq, potrei fare qualcosa del genere:

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

Ma voglio una query che possa fare invece tutto ciò di cui ho bisogno.

Devo davvero creare il mio metodo di enumerazione che utilizza la resa per creare ciò che voglio?

MODIFICA: per richiesta: Un esempio di ciò che vorrei poter fare:

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

Vorrei tirare il contrario ecc. nella query effettiva. Quindi tengo tutto raccolto. Extra: essere in grado di estrarlo con la sintassi simile allo sql ricoperto di zucchero, sarei elettrizzato. Invece di una catena di metodi, cioè.

È stato utile?

Soluzione

Puoi usare:

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

Modifica:

Data la tua nuova domanda, dovresti essere in grado di fare:

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

Altri suggerimenti

L'altra mia risposta è meno utile di quanto potrebbe essere, perché la funzione Enumerable.Zip è stata aggiunta nella versione 4.

Quindi, ecco come fare il tuo:

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

Usa Enumerable.Zip . Il tuo primo esempio può essere riscritto da:

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top