【问题标题】:LINQ: How to join nested Lists in an ObjectCollectionLINQ:如何在 ObjectCollection 中加入嵌套列表
【发布时间】:2010-07-16 09:56:48
【问题描述】:

是否可以在不使用 foreach 循环的情况下为以下问题定义 LINQ 语句?

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, 尤文

【问题讨论】:

    标签: sql linq nested-lists


    【解决方案1】:

    相信SelectManyDistinct可以解决这个问题!

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

    第二个变量名具有误导性。除其他字母外,它将返回一个 "m" 实例,它在原始集合中不是唯一的;)

    【讨论】:

    • 哇,你真快!我会试试的。
    • 完美运行!它比我的解决方案短得多。即使对于不了解 lambda 的人来说可能更神秘。非常感谢!
    • @Juve:不客气。我发现from ... 选择器在变得比这更复杂一点时会很快变得非常神秘。如果这能促使读者继续学习 lambda 在 C# 中的工作原理,那么您将极大地帮助他们;)
    【解决方案2】:

    如上所述,我自己找到了答案:

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

    我希望这对某人有所帮助。

    乔,尤文

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多