如何ToLookup()与多个索引?

考虑下面的C#Console应用程序的代码,使用

如何修改它以替换该行:

foreach (Product product in productsByCategory[category]) 

通过代码行

 foreach (Product product in productsByCategory[category][Id]) 

 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace myQuestion { class Program { static void Main(string[] args) { var products = new List { new Product { Id = 1, Category = "Garden", Value = 15.0 }, new Product { Id = 1, Category = "Garden", Value = 40.0 }, new Product { Id = 3, Category = "Garden", Value = 210.3 }, new Product { Id = 4, Category = "Pets", Value = 2.1 }, new Product { Id = 5, Category = "Electronics", Value = 19.95 }, new Product { Id = 6, Category = "Pets", Value = 21.25 }, new Product { Id = 7, Category = "Pets", Value = 5.50 }, new Product { Id = 8, Category = "Garden", Value = 13.0 }, new Product { Id = 9, Category = "Automotive", Value = 10.0 }, new Product { Id = 10, Category = "Electronics", Value = 250.0 } }; ILookup productsByCategory = products.ToLookup( p => p.Category); string category = "Garden"; int Id = 1; foreach (Product product in productsByCategory[category]) { Console.WriteLine("\t" + product); } Console.ReadLine(); } } public sealed class Product { public int Id { get; set; } public string Category { get; set; } public double Value { get; set; } public override string ToString() { return string.Format("[{0}: {1} - {2}]", Id, Category, Value); } } } 

更新:
这是一个人为的例子,旨在学习C# ToLookup方法的概念。

作为参考,我在阅读了大卫·安德烈斯的回答“问题的重点是什么?”后回答了这个问题。 :

 "A Lookup will map to potentially several values. Lookup["Smith"]["John"] will be a collection of size one billion." 

我想重现一下。

或者我明白错了?

我不确定我是否理解你的需求,但为什么你不能这样做:

 foreach (Product product in productsByCategory[category].Where(x=> x.Id == Id)) 

或者使用匿名对象:

 var productsByCategory = products.ToLookup(p => new { p.Category, p.Id }); string category = "Groceries"; int Id = 1; foreach (Product product in productsByCategory[new {Category = category, Id= Id}]) { Console.WriteLine("\t" + product); } 

这是与Servy的额外解决方案非常类似的问题

我偶然发现了这个问题,上面写着“关闭它,因为我确认这是不可能的 ”,并对这个话题进行了大量的研究。 我能得到的最接近的是:

努力寻找查找

事实certificate这是不可能的,因为:

  1. Lookup类型没有构造函数,只能使用.ToLookup() LINQ扩展函数,
  2. 所述函数没有resultSelector的重载(如.GroupBy()所做),因此总是只返回IGrouping

即使查找结果只是一个元素(另一个Lookup ),也不可能省略第一个IGrouping 。 因此,在每次调用“父” Lookup之后,都需要调用.ToList()[0] .Single() (或.First().ToList()[0].ElementAt(0) ),这是……臭,绝望。

使用嵌套的Dictionary可以实现访问元素的相同语法:

通过词典得到它

LINQPad C#代码上传到这里 。