Используйте выражение linq для получения одного массива или списка строк из коллекции объектов без использования foreach и addrange - PullRequest
1 голос
/ 18 июня 2009
public class Buddy
    {
        public string[] Sayings;
    }


Buddy one = new Buddy();
        one.Sayings = new[] {"cool", "wicked", "awesome"};

        Buddy two = new Buddy();
        two.Sayings = new[] {"bad", "lame", "boring"};

        Buddy[] buddies = new[] {one, two};

        IEnumerable<string[]> something =
            from b in buddies
            select b.Sayings;

Так что, в общем, я хотел бы получить один массив или список, содержащий {"крутые, злые, удивительные," плохие "," хромые "," скучные "} высказывания для каждого приятеля с использованием linq.

Я перепробовал все, что мог придумать, и начинаю сомневаться, что это можно сделать с помощью всего одного выражения linq. Я мог бы просмотреть каждого собеседника в списке собеседников и добавить в список «Поговорки» список, но я решил, что, изучая linq, я бы попробовал это таким образом. Возможно ли это, и если да, то как? Это также может быть применимо, если я хочу получить некоторые другие объекты внутри Buddy, в данном случае это просто список строк.

Ответы [ 4 ]

4 голосов
/ 18 июня 2009

Как насчет этого:

var result2 = buddies.SelectMany(b => b.Sayings);
2 голосов
/ 18 июня 2009

Джеккерс прав - это точно , что делает SelectMany в простейшем виде. Альтернативные перегрузки позволяют получить разные результаты, например, включая элемент «источник» в проекции.

Обратите внимание, что синтаксис выражения запроса для этого должен иметь более одного предложения from - каждое предложение после первого добавляет еще один вызов SelectMany. Код Jakers похож на:

var result2 = from buddy in buddies
              from saying in buddy.Sayings
              select saying;

за исключением того, что версия с точечной нотацией более эффективна - она ​​проецируется только один раз. Приведенный выше код компилируется в:

var result2 = buddies.SelectMany(buddy => buddy.Sayings, 
                                 (buddy, saying) => saying);
0 голосов
/ 18 июня 2009

        string[] a = new string[] {"a", "b", "c", "d"};
            string[] b = new string[] {"1", "2", "3"};

        var unioned = a.Union(b);
        foreach(string s in unioned)
            Console.WriteLine(s);
0 голосов
/ 18 июня 2009

Это должно работать ...

var buds = new [] { new Buddy { Sayings = new[] {"1","2","3"} },
                    new Buddy { Sayings = new[] {"4","5","6"} },
                    new Buddy { Sayings = new[] {"7","8","9"} } };


var res = buds.SelectMany( b => b.Sayings ).ToArray();
...