2017-04-27 57 views
0

我有以下2类,其是相互联系的对方,IEnumerable的<string>给出结果与值[ “1”, “1”],它应该得到[ “1”, “2”]

public class Class1 
{ 
    public List<Class2> ClassTwo { get; set; } 
} 
public class Class2 
{ 
    public string Name { get; set; } 
    public List<Class3> ClassThree { get; set; } 
} 
public class Class3 
{ 
    public string Name { get; set; } 
    public string Data { get; set; } 
} 

然后我们有一个以上的类,如下面的数据,

Class1 collectionRequest = new Class1() 
     { 
      ClassTwo = new List<Class2> 
     { 
      new Class2 { Name = "1", ClassThree = new List<Class3> { new Class3 { Name = "A", Data = "X" } } }, 
      new Class2 { Name = "2", ClassThree = new List<Class3> { new Class3 { Name = "A", Data = "X" } } }, 
      new Class2 { Name = "3", ClassThree = new List<Class3> { new Class3 { Name = "B", Data = "Y" } } } 
     } 
     }; 

现在,我正在下面LINQ,

var config = collectionRequest.ClassTwo 
    .SelectMany(cp => cp.ClassThree) 
    .GroupBy(cfg => cfg.Name) 
    .ToDictionary(g => g.Key, 
       g => g 
        .ToLookup(cfg => cfg.Data, 
          cfg => collectionRequest.ClassTwo 
           .FirstOrDefault().Name)); 

当我EXEC在下面,它给我IEnumerable的值[“1”,“1”],但我想返回值为IEnumerable [“1”,“2”]。

LINQ需要进行哪些更改?

var data = config["A"]["X"]; // gives IEnumerable<string> with values ["1","1"] 
+4

查找中的'value'总是'collectionRequest.ClassTwo.FirstOrDefault()。Name'。这是'1'。所以它正在做你所说的。你究竟在做什么? LINQ很难遵循。 –

+1

你是计算机科学的主要问题是计算机没有做你想做的事情,但是你告诉它做什么。 –

+0

如何修改此:cfg => collectionRequest.ClassTwo.FirstOrDefault()。Name –

回答

1

的问题是,您对查找“价值”的定义是这样的:

cfg => collectionRequest.ClassTwo.FirstOrDefault().Name 

这忽略了参数,并始终返回第一Class2实例的名称 - 这是1

下一个问题是,您没有任何参考实际Class2实例Class3来自。你需要保持这一点。为此,您可以使用LINQ查询语法:

var c2c3ByC3Name = 
    from c2 in collectionRequest.ClassTwo 
    from c3 in c2.ClassThree 
    group new {c2, c3} by c3.Name; 

而且你可以,当然,做相同的方法的语法:

var c2c3ByC3Name = collectionRequest.ClassTwo 
    .SelectMany(x => x.ClassThree, (c2, c3) => new {c2, c3}) 
    .GroupBy(x => x.c3.Name); 

然后,您同样可以创建查询之前:

var config = c2c3ByC3Name 
    .ToDictionary(
     grp => grp.Key, 
     grp => grp.ToLookup(x => x.c3.Data, x => x.c2.Name)); 

请参阅this fiddle进行工作演示。

+0

非常感谢查尔斯 – user584018

相关问题