列表类型和字典的替代

时间:2017-11-10 10:28:29

标签: c#

理想情况下,这就是我想要做的事情。

  private List<Type,Dictionary<string,string>> dynamicFields;

这样的例子就是。

  Class1      "1","value"
              "2","value1"

为什么我想要这个,我是否会为每个添加一个Type和一些字典字段,然后使用linq来检索属于每个类的那些以进行其他操作。

由于这是不可能的,因为编译器会给我错误。

“使用通用类型列表需要一个参数”

创建我想要的对象的方法可能是什么。

2 个答案:

答案 0 :(得分:2)

最简单的答案是使用字典词典:

private Dictionary<Type, Dictionary<string, string>> dynamicFields;

请注意,您需要确保在添加条目之前使用Dictionary<string, string>初始化每个外部条目,并且要获得内部条目,您需要对TryGetValue进行两次调用。正如您所描述的那样,您正在嵌套容器,并将内部字典传递给另一个方法,因此这可能确实是最佳选择。

希望每个Dictionary<string, string>只有一个Type。如果没有,你不能合并它们,你现在需要一个列表,事情又变得更加丑陋了:

private Dictionary<Type, List<Dictionary<string, string>>> dynamicFields;

然而,这仍然可以说是在给定某个Type的情况下检索内部词典列表的最有效方法。

现在,您正在寻找替代方案。我不确定这是否适用于您的特定情况,但听起来您正在尝试创建一组属性包,我可能想要称之为静态扩展属性。我会质疑你是否真的希望属性包是静态的,或者它们是否属于Class1等人的实例。在这种情况下,我建议您的类继承自包含可扩展属性包的基类。 ExpandoObject基本上已经这样做了,但如果你明确想要字符串字典,你可以自己实现一些东西。例如:

abstract class DynamicFieldEntity
{
    protected Dictionary<string, string> DynamicFields { get; } = 
        new Dictionary<string, string>();
}

class Class1 : DynamicFieldEntity {}

答案 1 :(得分:1)

因为List只接受一个参数作为泛型参数。 你必须像这样声明一个A类:

public class A
{
     public Type Type { get; set; }
     public Dictionary<string, string> KeyValue { get; set; }
}

然后将列表声明为private List<A> dynamicFields