键值列表使用哪种数据结构

时间:2019-05-10 10:29:23

标签: c# dictionary

我正在尝试确定我需要的数据结构。我有要在电子表格中更新的字段列表。这些字段是静态且可预测的。下面的示例照片(实际上,字段名称比所示的示例更有意义)。我可能没有输入的所有值;即我只能将数据插入“示例字段1-8”字段中。然后,我将仅使用填充的值来搜索字段名称并更新电子表格中的条目。

enter image description here

我的想法是创建一个Dictionary<string, string>,键为字段名称,并使用空值字段实例化。例如

public Dictionary<string, string> FieldList = new Dictionary<string, string>
    {
        {"Example Field 1", ""},
        {"Example Field 2", ""},
        {"Example Field 3", ""},
        ...
    };

但是,这对我来说似乎有点笨拙,因为我将不得不知道完整的字段名称,以便稍后将值添加到字典中,这似乎无法达到目的。例如FieldList["Example Field 2"] = "Field 2 Value";

我的另一个想法是创建一个类...

class SpreadsheetField
{
    public string DisplayName { get; set; }
    public string Value { get; set; }
}
class SpreadsheetFields
{
    SpreadsheetField ExampleField1 = new SpreadsheetField
    {
        DisplayName = "Example Field 1"
    };
    SpreadsheetField ExampleField2 = new SpreadsheetField
    {
        DisplayName = "Example Field 2"
    };

    ...
}

此选项为我提供了很好的智能感知,可以用来引用这些字段。即SpreadsheetField.ExampleField2.Value = "Field 2 Value" 然后,我可以使用DisplayName属性在我需要更新的电子表格中的位置中找到该字段。但是,这对我在这里想要做的事情来说是太过分了吗?我应该坚持词典还是有更好的选择?另外,对于该类解决方案,是否可以设置DisplayName为ReadOnly / Const,因为一旦初始化它就不可编辑。

3 个答案:

答案 0 :(得分:1)

选项A的优点是易于扩展。您不需要预先填充字典,例如,FieldList["Example Field 2"] = "Field 2 Value";将创建一个新条目(如果不存在)。 选项B稍快一些(不需要键查找),正如您所说的,Intellisense可以帮助您。它确实需要更改代码以添加/删除字段。 您的选择。

答案 1 :(得分:1)

如果使用字典,则可以只添加确实具有值的对。

        Dictionary<string, string> dict = new Dictionary<string, string>();

//----------

        string value = "test";
        string key = "some key";

        if (dict.ContainsKey(key))
        {
            dict[key] = value;
        }
        else
        {
            if(value == string.Empty)
            {
                dict.Remove(key);
            }
            else
            {
                dict.Add(key, value);
            }
        }

也许是一些“经典”的if / else,但它使字典保持整洁高效,并且其代码比静态写出的要少

在一个类中,它可能类似于:

using System.Collections.Generic;
using System.Linq;



  public class SpreadsheetMapper
    {

        private static readonly Dictionary<string, string> dict = new Dictionary<string, string>();

        public static void Map(string key, string value)
        {
            if(key==String.Empty)
            {
               throw new ArgumentException();
            }
            if (dict.ContainsKey(key))
            {
                dict[key] = value;
            }
            else
            {
                if (value == string.Empty)
                {
                    dict.Remove(key);
                }
                else
                {
                    dict.Add(key, value);
                }
            }
        }

        public static string Value(string key)
        {
            if (dict.ContainsKey(key) & key!=String.Empty)
            {
                return dict[key];
            }
        }

        public static IEnumerable<string> Keys(string value)
        {
            return dict.Where(x => x.Value == value).Select(x=> x.Key);
        }
    }

SpreadsheetMapper.Map("some key 1", "some value")
SpreadsheetMapper.Value("some key")
etc...

答案 2 :(得分:0)

您可以将空条件运算符与字典值一起使用,因此不必初始化为空字符串,它会检查其是否为空:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/member-access-operators

示例:

A?.B?.Do(C);