1

考虑以下:

字典:

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

洋溢着:

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

(在key处填充 ProductId,在value处填充Quantity 。)

我也有list<int>

列表:

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

洋溢着:

1
5
6
7

(用 CategoryId 填充。)

伪代码应该是这样的:

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

结果应如下所示:

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

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

注意:问题中最重要的部分:如何将 aDictionaryList新的Dictinary.

4

5 回答 5

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>>

包含and<int, int>的对象在哪里。ProductIdQuantity

上面的答案给你

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

在哪里

<int, int, int>

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

{
    int CategoryId { get; set; }
    int ProductId  { get; set; }
    int Quantity { get; set; }
}
于 2013-09-11T12:28:09.110 回答
2

你不能吗

//Dictionary<catId, Dictionary<prodId, quantity>>
Dictionary<int, Dictionary<int, int>>
于 2013-09-11T12:27:10.770 回答
1

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

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

如果你走元组路线,你可以在集合中使用它(包括字典)

List<Tuple<int, int, int>> myTuples = new List<Tuple<int, int, int>>();
foreach(var myTuple in myTuples)
    DoWork(myTuple.Item1, myTuple.Item2, myTuple.Item3);
于 2013-09-11T12:27:53.257 回答
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

于 2013-09-11T12:29:39.870 回答
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;
  }
于 2013-09-11T12:30:43.203 回答