在1个词典中合并列表和词典

时间:2013-09-11 12:21:06

标签: c#

请考虑以下事项:

词典:

Dictionary<int, int> ProductIdQuantityDictionary = new Dictionary<int, int>();

填写:

1, 54
2, 78
3,  5
6, 13

key 的ProductId和值的数量填充。)

我也有list<int>

列表:

List<int> CategoryIdList = new List<int>();

填写:

1
5
6
7

(填写CategoryId。)

Psuedo代码应该是这样的:

Dictionary<CategoryIdList, ProductIdQuantityDictionary> MergedDictionary = new Dictionary<CategoryIdList, ProductIdQuantityDictionary>();

结果如下:

1, 1, 54
5, 2, 78
6, 3, 5
7, 6, 13

我听说过Tuple,但我不知道如何实施。如果可能的话,是否有一种简单的方法来填充超过2个值的字典?

注意:问题中最重要的部分:如何在新Dictionary中合并ListDictinary

5 个答案:

答案 0 :(得分:4)

您可以使用Zip方法:

var merged = ProductIdQuantityDictionary.Zip(CategoryIdList, (pair, id) => 
                 new 
                 { 
                     CategoryId = id,
                     ProductId = pair.Key,
                     Quantity = pair.Value
                 })
             .ToDictionary(x => x.CategoryId );

Dictionary<int,int>给出了不确定的顺序。由于缺少CategoryProduct与您的问题相关的解释,这是我能提出的最接近的建议。

<强>更新

您的问题和伪代码不清楚。我不认为你想要

Dictionary<List<int>, Dictionary<int,int>>

我认为你正在寻找更接近

的东西
Dictionary<int, <int, int>>

其中<int, int>是包含ProductIdQuantity的对象。

以上答案为您提供

Dictionary<int, <int, int, int>>

,其中

<int, int, int>

是一个具有以下结构的匿名对象:

{
    int CategoryId { get; set; }
    int ProductId  { get; set; }
    int Quantity { get; set; }
}

答案 1 :(得分:2)

你能不能做到

//Dictionary<catId, Dictionary<prodId, quantity>>
Dictionary<int, Dictionary<int, int>>

答案 2 :(得分:1)

Dictionary可以将集合作为值,包括另一个字典。

Dictionary<int, List<int>>
Dictionary<int, Dictionary<int, int>>

或者,Tuple本质上是一个小型的类型 - 你所拥有的只是一些属性。下行是你如何访问它们 - 没有这样命名可能会令人困惑。

Tuple<int, int, int> myTuple = new Tuple<int, int, int>(1, 2, 3);
DoWork(myTuple.Item1, myTuple.Item2, myTuple.Item3);

如果你去了Tu​​ple路线,你可以在一个集合中使用它(包括字典)

List<Tuple<int, int, int>> myTuples = new List<Tuple<int, int, int>>();
foreach(var myTuple in myTuples)
    DoWork(myTuple.Item1, myTuple.Item2, myTuple.Item3);

答案 3 :(得分:1)

这可能看起来很有吸引力,简洁明了。您可以根据需要将尽可能多的属性链接到产品。但是,也许,您可以考虑将其作为属性为Product的类{。}}。

struct ProductAttributes
{
    public int Quantity;
    public List<int>Categories;
}

Dictionary<int ProductId, ProductAttributes> = new Dictionary<Int, ProductAttributes>();

或者您可以通过执行类似(伪代码)的事情来发疯:Dict<Dict<Dict<KeyValuePair<List<Dict<T, T>>, T>>>> = new Dict<Dict<Dict<KeyValuePair<List<Dict<T, T>>, T>>>>();如果您愿意,可以将所有产品属性嵌套在单行中:D但如果您喜欢单行,则元组可能是什么你寻求:http://msdn.microsoft.com/en-us/library/system.tuple.aspx

答案 4 :(得分:1)

var combined = new List<Tuple<int,int.int>>()
for(int i=0; i<categoryList.Count(); i++)
{
 var e = categoryList[i];
 var dicKeys = ProductIdQuantityDictionary.Keys;
 if(i < dicKeys.Count()){
 combined.Add(new Tuple(e,dicKeys[i],ProductIdQuantityDictionary[dicKeys[i]]))
 }
 else
 {
  combined.Add(new Tuple(e,0,0))
 }
}

稍后您可以将其作为

进行访问
 foreach(var t in Combined)
  {
    //t.Item1;
    //t.Item2;
    //t.Item3;
  }