5

考虑到下面 C# 控制台应用程序的代码,使用

我应该如何修改它以替换该行:

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<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);
    }
  }
}

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

作为参考,我在阅读了大卫安德烈斯对问题“查找的意义何在?”的回答后提出了这个问题。

"A Lookup will map to potentially several values.  

Lookup["Smith"]["John"] will be a collection of size one billion."   

我想重现。

还是我理解错了?

4

2 回答 2

8

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

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提供了额外的解决方案

于 2013-03-31T21:06:01.837 回答
5

我偶然发现了这个问题,阅读了“关闭它,因为我已经确认这是不可能的”,并对该主题进行了大量研究。我能得到的最接近的是:

努力查找查找

事实证明这是无法做到的,因为:

  1. type 没有构造函数,Lookup<T, T>只能使用.ToLookup()LINQ 扩展函数,
  2. 所述函数没有resultSelector(like .GroupBy()does) 的重载,因此总是只返回IGrouping<TKey, TElement>

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

访问元素的相同语法可以通过嵌套来实现Dictionary<T, T>

用字典搞定

LINQPad C# 代码在这里上传。

于 2016-07-06T16:45:46.340 回答