2010-07-16 48 views
2

是否可以在不使用foreach循环的情况下为以下问题定义LINQ语句?LINQ:如何在ObjectCollection中连接嵌套的列表

public class GroupObject 
{ 
    public String name; 
    public List<String> letters; 

    public void test() 
    { 
     List<GroupObject> myGroups = new List<GroupObject> { 
      new GroupObject { 
       name="test1", 
       letters=new List<String>{"x","y","z"} 
      }, 
      new GroupObject { 
       name="test2", 
       letters=new List<String>{"l","m","n"} 
      }, 
      new GroupObject { 
       name="test3", 
       letters=new List<String>{"m","x","z"} 
      } 
     }; 

     // LINQ problem 1: how to get a list of all 9 letters 
     // List<string> allLetters = (from ...).ToList(); 

     // LINQ problem 2: how to get a list of all 6 DISTINCT letters 
     // List<string> allDistictLetters = (from ...).ToList(); 
    } 
} 

在写这个问题时,我找到了一个解决问题的办法。我仍然会发布(和回答)这个问题,因为这个问题对我来说是一个真正的问题。我在这里找不到合适的现有问题。

的Ciao, 尤文

回答

4

我相信这个问题可以通过SelectManyDistinct来解决!

var allLetters = myGroups.SelectMany(go => go.letters); 
var allUniqueLetters = allLetters.Distinct(); 

第二个变量名是误导性的。它会返回,其他字母中,一个实例"m",这是原来的收藏中没有唯一的;)

+0

哇,你真快!我会尝试的。 – Juve 2010-07-16 10:01:06

+0

完美的作品!而且比我的解决方案短得多。即使它对于不懂lambda的人来说可能更加神秘。 Thx非常! – Juve 2010-07-16 10:05:51

+0

@Juve:不客气。我发现,从......开始,选择器很快变得非常神秘,当它们比这更复杂时。如果这提示读者继续学习lambda在C#中的工作方式,那么您将会非常帮助他们;) – 2010-07-16 10:07:48

0

如上所述,我发现了自己的答案:

List<string> allLetters = (from g in myGroups from l in g.letters select l).ToList(); 
List<string> allDistinctLetters = allLetters.Distinct().ToList(); 

我希望这是很有帮助的为某人。

Ciao,Juve