1
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;

所以基本上我想得到一个数组或列表,其中包含 {"cool, wicked, awesome, "bad", "lame", "boring"} 每个使用 linq 的好友的说法。

我尝试了我能想到的一切,并开始怀疑它是否可以只用一个 linq 表达式来完成。我可以通过 buddies 中的每个 buddy 并将 Sayings 上的 addrange 添加到一个列表中,但我想,因为我正在学习 linq,所以我会尝试这种方式。有可能吗?如果可以,怎么办?如果我想在 Buddy 中获取一些其他对象,这也可能适用,在这种情况下,它只是字符串列表。

4

4 回答 4

4

这个怎么样:

var result2 = buddies.SelectMany(b => b.Sayings);
于 2009-06-17T20:29:34.053 回答
2

Jakers 是对的——这正是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);
于 2009-06-17T20:37:19.217 回答
0

这应该工作...

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();
于 2009-06-17T20:36:12.167 回答
0

        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);
于 2009-06-17T20:37:05.580 回答