【问题标题】:Nested classes lists LINQ嵌套类列出 LINQ
【发布时间】:2014-04-04 15:16:41
【问题描述】:

我有以下课程:

public class SerializedDelegate
{
    public List<GOEntry> goEntries = new List<GOEntry>();
}
public class GOEntry
{
    public string go;
    public List<MBEntry> mbEntries = new List<MBEntry>();
}
public class MBEntry
{
    public string mb;
    public List<MethodEntry> methodsEntries = new List<MethodEntry>();
}
public class MethodEntry
{
    public string method;
}

还有这个数据:

var sd = new SerializedDelegate();
var eGo1 = new GOEntry { go = "Player1" };
var eGo2 = new GOEntry { go = "Player2" };
var eMb1 = new MBEntry { mb = "MB1" };
var eMb2 = new MBEntry { mb = "MB2" };
var eM1 = new MethodEntry { method = "target1" };
var eM2 = new MethodEntry { method = "target2" };
var eM3 = new MethodEntry { method = "target3" };
var eM4 = new MethodEntry { method = "target4" };
eMb1.methodsEntries.Add(eM1);
eMb1.methodsEntries.Add(eM2);
eMb2.methodsEntries.Add(eM3);
eMb2.methodsEntries.Add(eM4);
eGo1.mbEntries.AddRange(new[] { eMb1, eMb2 });
eGo2.mbEntries.Add(eMb1);
sd.goEntries.AddRange(new[] { eGo1, eGo2 });

我正在尝试做的 - 以以下形式打印它们:

     Player1: MB1.target1
     Player1: MB1.target2
     Player1: MB2.target3
     Player1: MB2.target4
     Player2: MB1.target1
     Player2: MB1.target2

我已经使用 foreach 循环打印了它们:

foreach (var goEntry in sd.goEntries) {
    foreach (var mbEntry in goEntry.mbEntries) {
        foreach (var methodEntry in mbEntry.methodsEntries)
            Console.WriteLine(goEntry.go + ": " + mbEntry.mb + "." + methodEntry.method);
    }
}

但我想以 LINQ 的方式来做——我想构造一个与我想要打印它们的方式相对应的 LINQ 结构——这样我只需要一个 foreach 循环(所以构造的可枚举的长度就是数字方法总数 - 在本例中为 6)。

我是这样开始的 - 但不知道如何继续:

var entries = sd.goEntries
    .Select(g => new
    {
        GO = g.go,
        MBs = g.mbEntries,
        Methods = g.mbEntries.SelectMany(e => e.methodsEntries)
    });

最终,这些方法条目将出现在一个弹出窗口中——这就是为什么我需要一个结构,通过它我可以很容易地分辨出哪个MBEntry 属于哪个GOEntry,以及MethodEntry 属于哪个@987654329 @。

对不起,如果我不够清楚 - 如果是这样,请说出来。

谢谢。

【问题讨论】:

    标签: c# linq


    【解决方案1】:
    var entries = from goEntry in sd.goEntries
                  from mbEntry in goEntry.mbEntries
                  from methodEntry in mbEntry.methodsEntries
                  select new { goEntry.go, mbEntry.mb, methodEntry.method };
    

    你可以这样输出条目:

     foreach(var entry in entries)
        Console.WriteLine("{0}: {1}.{2}", entry.go, entry.mb, entry.method);
    

    【讨论】:

    • 谢谢! - 啊,我错过了。您能否发布长点线 linq 扩展方法格式?
    • @vexe 不会那么漂亮,因为您需要使用中间匿名对象和 SelectMany 方法
    • 啊……这就解释了为什么我遇到了麻烦……看来我必须更频繁地使用SQL格式。
    • @SergeyBerezovskiy:您不需要比您的示例中更多的匿名对象,它只是没有在附近读取(请参阅我的实现答案)。
    • @Chris 我知道,这就是我删除更新的原因。无论如何 - 我会在这里使用查询语法
    【解决方案2】:

    听起来你想要这样的东西:

    var lines = from goEntry in sd.goEntries
                from mbEntry in goEntry.mbEnties
                from methodEntry in mbEntry.methodsEntries
                select string.Format("{0}: {1}.{2}",
                                     goEntry.go, mbEntry.mb, methodEntry.method);
    
    foreach (var line in lines)
    {
        Console.WriteLine(line);
    }
    

    或者,如果您希望稍后再进行格式化:

    var entries = from goEntry in sd.goEntries
                  from mbEntry in goEntry.mbEnties
                  from methodEntry in mbEntry.methodsEntries
                  select new { goEntry, mbEntry, methodEntry };
    
    foreach (var entry in entries)
    {
        Console.WriteLine("{0}: {1}.{2}", entry.goEntry.go,
                          entry.mbEntry.mb, entry.methodEntry.method);
    }
    

    ... 或根据 Sergey 的回答捕获单个值以格式化(goEntry.go 等)。很多不同的方法:)

    【讨论】:

      【解决方案3】:

      其他人给出了更好看的答案,但是由于您在其他评论中询问了它的方法版本,所以我在这里提出:

      sd.goEntries.SelectMany(
          ge=>ge.mbEntries.SelectMany(
              mb=>mb.methodsEntries.Select(
                  me=>new {me.method, mb.mb, ge.go}
              )
          )
      )
      

      与其他两个当前答案所证明的查询语法样式相比,要了解它的作用要困难得多。

      【讨论】:

      • 感谢您的回答 - 是的,这很麻烦。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多