0

我有一个字典对象,其类型如下。

Dictionary<string, Dictionary<Roles, Dictionary<Period, List<Product>>>>

以“准备者”和“批准者”为项目的角色(是一个枚举)。同样 Period 是另一个具有“Ahead”和“Past”项目的枚举。

该列表包含各种产品的列表。

我在字典中有以下层次结构中的项目。

"Sachin" --> Roles.Preparer --> Period.Past --> Products
"Sachin" --> Roles.Approver --> Period.Ahead --> Products
"Sachin" --> Roles.Approver --> Period.Ahead --> Products
"Sachin" --> Roles.Approver --> Period.Past --> Products

我将不得不按以下顺序对字典进行排序。

"Sachin" --> Roles.Preparer --> Period.Ahead --> Products
"Sachin" --> Roles.Approver --> Period.Ahead --> Products
"Sachin" --> Roles.Preparer --> Period.Past --> Products
"Sachin" --> Roles.Approver --> Period.Past --> Products

这种结构是必需的,因为我必须遍历每个项目并且应该将其添加为邮件的一部分。

实际代码是这样的。

`using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Basics
{
    class Product
    {
        public string Name { get; set; }
        public int Days { get; set; }

    }

    enum Period
    {
        Ahead,
        Past
    }

    enum Roles
    {
        Preparer,
        Approver
    }

    class Program
    {
        static void Main(string[] args)
        {
            DictionaryProcessing(new string[] { "sriram123@yahoo.com", "abhishek321@yahoo.com" });
        }

        private static void DictionaryProcessing(string[] emailIDs)
        {
            List<Product> products = new List<Product>();

            Product product1 = new Product() { Name = "Pencil", Days = 14 };
            Product product2 = new Product() { Name = "Eraser", Days = 2 };
            Product product3 = new Product() { Name = "Geometry Box", Days = 31 };

            products.Add(product1);
            products.Add(product2);
            products.Add(product3);

            Dictionary<string, Dictionary<Roles, Dictionary<Period, List<Product>>>> dict = new Dictionary<string, Dictionary<Roles, Dictionary<Period, List<Product>>>>();

            ///

            foreach (string emailID in emailIDs)
            {

                if (!dict.ContainsKey(emailID))
                    dict.Add(emailID, new Dictionary<Roles, Dictionary<Period, List<Product>>>());

                if (!dict[emailID].ContainsKey(Roles.Preparer))
                    dict[emailID].Add(Roles.Preparer, new Dictionary<Period, List<Product>>());

                if (!dict[emailID][Roles.Preparer].ContainsKey(Period.Ahead))
                    dict[emailID][Roles.Preparer].Add(Period.Ahead, new List<Product>());

                if (!dict[emailID][Roles.Preparer].ContainsKey(Period.Past))
                    dict[emailID][Roles.Preparer].Add(Period.Past, new List<Product>());

                ///

                if (!dict[emailID].ContainsKey(Roles.Approver))
                    dict[emailID].Add(Roles.Approver, new Dictionary<Period, List<Product>>());

                if (!dict[emailID][Roles.Approver].ContainsKey(Period.Ahead))
                    dict[emailID][Roles.Approver].Add(Period.Ahead, new List<Product>());

                if (!dict[emailID][Roles.Approver].ContainsKey(Period.Past))
                    dict[emailID][Roles.Approver].Add(Period.Past, new List<Product>());

                for (int i = 0; i < products.Count; i++)
                {
                    dict[emailID][Roles.Preparer][Period.Ahead].Add(products[i]);
                    dict[emailID][Roles.Preparer][Period.Past].Add(products[i]);
                    dict[emailID][Roles.Approver][Period.Past].Add(products[i]);
                    dict[emailID][Roles.Approver][Period.Ahead].Add(products[i]);
                }


            }
        }
    }
}
`

如何按此顺序对其进行排序?我仅限于使用 .NET 2.0 框架。

4

2 回答 2

1

字典无法排序。它们不是列表。此外:

您的结构很糟糕 - aDictionary不能多次包含相同的密钥,因此您提供的示例甚至无法创建:

"Sachin" --> Roles.Preparer --> Period.Past --> Products
"Sachin" --> Roles.Approver --> Period.Ahead --> Products
"Sachin" --> Roles.Approver --> Period.Ahead --> Products
"Sachin" --> Roles.Approver --> Period.Past --> Products

“外部”字典不能多次包含键“Sachin”。“内部字典”不能Approver多次包含角色,并且在最后一级,Period.Past/Ahead不能多次作为键。

List<T>相反,将您的结构更改T为合适的数据结构,或者,正如其他人已经指出的那样,现在更改为类型化的数据集以将您的结构视为表格。

编辑
我现在正在编辑我的答案,只是为了确保我们都明白每个人都在说什么。

我是说,字典不可能有两次相同的键。因此,根据此规则,您的案件必须减少到以下情况:

"Sachin" --> Roles.Preparer --> Period.Past --> Products
"Sachin" --> Roles.Approver --> Period.Ahead --> Products
"Sachin" --> Roles.Approver --> Period.Past --> Products

既然我们正在谈论适用于规则的东西,我们可以问“如何排序?”。答案是:你不能。根据定义,字典是一种无序结构。但是,您可以确保按特定顺序检索值。如果您想对产品进行“排序”,使Past产品始终排在Ahead产品之前,请确保先使用相应的密钥。

编辑 2

刚刚意识到这是基于复制/粘贴错误。您正在谈论的数据应为:

"Sachin" --> Roles.Preparer --> Period.Ahead --> Products
"Sachin" --> Roles.Preparer --> Period.Past --> Products
"Sachin" --> Roles.Approver --> Period.Past --> Products
"Sachin" --> Roles.Approver --> Period.Ahead --> Products

您说您正在使用此代码添加项目:

for (int i = 0; i < products.Count; i++)
{
    dict[emailID][Roles.Preparer][Period.Ahead].Add(products[i]);
    dict[emailID][Roles.Preparer][Period.Past].Add(products[i]);
    dict[emailID][Roles.Approver][Period.Past].Add(products[i]);
    dict[emailID][Roles.Approver][Period.Ahead].Add(products[i]);
}

然后您可以使用类似的代码来检索项目。给定一个电子邮件 ID,以下内容将为您提供按“准备者在批准者之前”和“过去之前在前面”排序的项目列表:

List<Product> productsForEMailID = new List<Product>();

productsForEMailID.AddRange(dict[emailID][Roles.Preparer][Period.Past]);
productsForEMailID.AddRange(dict[emailID][Roles.Approver][Period.Past]);
productsForEMailID.AddRange(dict[emailID][Roles.Preparer][Period.Ahead]);
productsForEMailID.AddRange(dict[emailID][Roles.Approver][Period.Ahead]);

产品列表是“排序的”。

于 2013-01-21T10:12:33.207 回答
0

您可以使用另一种更适合此问题的密钥。如果你想快速破解SortedDictionary<string, List<Product>>

"Sachin#0#0" --> Products
"Sachin#0#1" --> Products
...

在这里,我假设“#”字符不能出现在名称中。第一个数字表示RolesPreparer = 0, Approver = 1,第二个数字表示PeriodAhead = 0, Past = 1

或者 - 如果您需要一个更强大的解决方案,我会做类似的事情:

public struct Key : IComparable<Key>
{
    public String Name;
    public Roles Role;
    public Period Period;

    public int CompareTo(Key other)
    {
        var c = String.Compare(Name, other.Name, StringComparison.Ordinal);
        if (c != 0) return c;
        c = Role.CompareTo(other.Role);
        if (c != 0) return c;
        return Period.CompareTo(other.Period);
    }
}

...并使用SortedDictionary<Key, List<Product>>.

于 2013-01-21T10:38:17.287 回答