إنشاء العداد <{نوع البيانات، نوع البيانات}> من 2 enumerables؟

StackOverflow https://stackoverflow.com/questions/1616554

  •  06-07-2019
  •  | 
  •  

سؤال

ومرحبا.

وهذا هو ما أريد القيام به:

    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، وسأكون بالإثارة. بدلا من سلسلة طريقة، وهذا هو.

هل كانت مفيدة؟

المحلول

ويمكنك استخدام:

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

نصائح أخرى

وجوابي الأخرى هي أقل فائدة مما كان يمكن أن يكون، لأنه تم إضافة وظيفة Enumerable.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);
            }
        }
    }
}

استخدم Enumerable.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