Ful*_*oof 4 .net c# linq lookup lambda
考虑下面的C#Console应用程序的代码,使用
我应该如何修改它以替换该行:
foreach (Product product in productsByCategory[category])
Run Code Online (Sandbox Code Playgroud)
通过代码行
foreach (Product product in productsByCategory[category][Id])
Run Code Online (Sandbox Code Playgroud)
?
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<Product>
{
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<string, Product> 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
这是一个人为的例子,旨在学习C#ToLookup方法的概念.
作为参考点,我在阅读了大卫·安德烈斯的回答"问题的重点是什么?"后回答了这个问题.:
"A Lookup will map to potentially several values.
Lookup["Smith"]["John"] will be a collection of size one billion."
Run Code Online (Sandbox Code Playgroud)
我想重现一下.
或者我明白错了?
不确定我是否理解你的需求,但为什么你不能这样做:
foreach (Product product in productsByCategory[category].Where(x=> x.Id == Id))
Run Code Online (Sandbox Code Playgroud)
或者使用匿名对象:
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);
}
Run Code Online (Sandbox Code Playgroud)
这是与Servy的额外解决方案非常类似的问题
我偶然发现了这个问题,阅读“关闭它作为向我证实这是不可能的”并对该主题进行了大量研究。我能得到的最接近的是这个:
事实证明这是不可能的,因为:
Lookup<T, T>只能使用.ToLookup()LINQ 扩展函数,resultSelector(like .GroupBy()do),因此总是只返回IGrouping<TKey, TElement>.即使查找的结果只是一个元素(another Lookup),也不可能省略第一个IGrouping。因此,在每次调用 "parent" 之后都需要调用.Single()(or .First()or .ToList()[0]or .ElementAt(0)) Lookup,这是......臭和绝望。
访问元素的相同语法可以通过嵌套来实现Dictionary<T, T>:
LINQPad C# 代码在这里上传。