Frage

HALLO.

Dies ist, was ich tun möchte:

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

Was ich will:

9 | 1
1 | 9

Was ich wirklich bekommen:

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

Der Code ist ein reines Beispiel. Es könnte durch Arrays oder einer anderen Sammlung iterieren. Es wird auch einige andere Dinge tun, aber sie sind irrelevant für dieses Problem.

Ohne Linq, ich könnte etwas tun:

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

Aber ich möchte eine Abfrage, die alles, was ich stattdessen brauchen tun können.

Muss ich wirklich meine eigene enumerator Methode erstellen, die Ausbeute verwendet, um zu schaffen, was ich will?

EDIT: pro Anfrage: Ein Beispiel dafür, was ich zu tun in der Lage sein möchte:

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

Ich mag die Reverse usw. in der aktuellen Abfrage ziehen. Also ich halte es alle versammelt. Extra: Die Möglichkeit, dies mit der SQL-ähnlicher Syntax sugarcoated zu ziehen, würde ich begeistert sein. Anstelle einer Methode Kette, das ist.

War es hilfreich?

Lösung

Sie können mit:

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

Edit:

Ihre neue Frage gegeben, sollten Sie in der Lage zu tun:

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

Andere Tipps

Meine andere Antwort ist weniger nützlich, als es sein könnte, weil die Enumerable.Zip Funktion in Version 4 hinzugefügt.

So, hier ist, wie man Ihre eigene Rolle:

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

Verwenden Sie Enumerable.Zip . Ihr erstes Beispiel kann von neu geschrieben werden:

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);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top