我正在尝试确定我需要的数据结构。我有要在电子表格中更新的字段列表。这些字段是静态且可预测的。下面的示例照片(实际上,字段名称比所示的示例更有意义)。我可能没有输入的所有值;即我只能将数据插入“示例字段1-8”字段中。然后,我将仅使用填充的值来搜索字段名称并更新电子表格中的条目。
我的想法是创建一个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,因为一旦初始化它就不可编辑。
答案 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);