Dre*_*rew 13 c# dictionary private idictionary concurrentdictionary
我有一个静态类,我在其中使用字典作为查找表来映射.NET类型和SQL类型.这是一个这样的字典的例子:
private static readonly Dictionary<Type, string> SqlServerMap = new Dictionary<Type, string>
{
{typeof (Boolean), "bit"},
{typeof (Byte[]), "varbinary(max)"},
{typeof (Double), "float"},
{typeof (Byte), "tinyint"},
{typeof (Int16), "smallint"},
{typeof (Int32), "int"},
{typeof (Int64), "bigint"},
{typeof (Decimal), "decimal"},
{typeof (Single), "real"},
{typeof (DateTime), "datetime2(7)"},
{typeof (TimeSpan), "time"},
{typeof (String), "nvarchar(MAX)"},
{typeof (Guid), "uniqueidentifier"}
};
Run Code Online (Sandbox Code Playgroud)
然后我在下面有一个公共方法,它传入一个.NET类型,它使用这个字典返回相应的MS SQL Server类型的字符串值.但是,由于这被用作进行数据库查询的查找表,我认为将其作为一个有意义ConcurrentDictionary
.我改成了:
private static readonly IDictionary<Type, string> SqlServerMap = new ConcurrentDictionary<Type, string>
{
{typeof (Boolean), "bit"},
{typeof (Byte[]), "varbinary(max)"},
{typeof (Double), "float"},
{typeof (Byte), "tinyint"},
{typeof (Int16), "smallint"},
{typeof (Int32), "int"},
{typeof (Int64), "bigint"},
{typeof (Decimal), "decimal"},
{typeof (Single), "real"},
{typeof (DateTime), "datetime2(7)"},
{typeof (TimeSpan), "time"},
{typeof (String), "nvarchar(MAX)"},
{typeof (Guid), "uniqueidentifier"}
};
Run Code Online (Sandbox Code Playgroud)
但现在它强调了内部的所有红色{}
(即所有键值对ConcurrentDictionary
),错误是:
无法在此处访问私有方法"添加"
我不认为这是因为我将其初始化为private static readonly
,因为我只是通过制作public static
版本进行测试而且我得到了相同的错误.
Ste*_*ong 17
试试这个
private static readonly IDictionary<Type, string> SqlServerMap =
new ConcurrentDictionary<Type, string>(
new Dictionary<Type, string>()
{
{typeof(Boolean ), "bit" },
{typeof(Byte[] ), "varbinary(max)" },
{typeof(Double ), "float" },
{typeof(Byte ), "tinyint" },
{typeof(Int16 ), "smallint" },
{typeof(Int32 ), "int" },
{typeof(Int64 ), "bigint" },
{typeof(Decimal ), "decimal" },
{typeof(Single ), "real" },
{typeof(DateTime), "datetime2(7)" },
{typeof(TimeSpan), "time" },
{typeof(String ), "nvarchar(MAX)" },
{typeof(Guid ), "uniqueidentifier"}
}
);
Run Code Online (Sandbox Code Playgroud)
更新:如果您使用的是C#6(Roslyn 2.0编译器),则可以使用新的Dictionary Initializers.
private static readonly IDictionary<Type, string> SqlServerMap =
new ConcurrentDictionary<Type, string>
{
[typeof(Boolean )] = "bit" ,
[typeof(Byte[] )] = "varbinary(max)" ,
[typeof(Double )] = "float" ,
[typeof(Byte )] = "tinyint" ,
[typeof(Int16 )] = "smallint" ,
[typeof(Int32 )] = "int" ,
[typeof(Int64 )] = "bigint" ,
[typeof(Decimal )] = "decimal" ,
[typeof(Single )] = "real" ,
[typeof(DateTime)] = "datetime2(7)" ,
[typeof(TimeSpan)] = "time" ,
[typeof(String )] = "nvarchar(MAX)" ,
[typeof(Guid )] = "uniqueidentifier"
};
Run Code Online (Sandbox Code Playgroud)
示例 https://dotnetfiddle.net/9ZgjsR
Ser*_*rvy 14
只有当集合具有Add
适当签名和可访问性的方法时,您用于填充集合的集合初始值设定项才有效. ConcurrentDictionary
没有公共Add
方法,因此您将无法使用集合初始值设定项.
您可以通过将IEnumerable<KeyValuePair<TKey, TValue>>
一个参数作为参数传递给构造函数来提供一些初始数据,或者您可以在创建后在循环中调用TryAdd
(或AddOrUpdate
,或者名称中的任何其他方法Add
)ConcurrentDictionary
.
作为 Servy 接受的答案的代码示例,为了ConcurrentDictionary
在实例化时初始化 a ,您可以将实现类型IEnumerable
(如 a List
)的KeyValuePair
类型传递给构造函数:
private static readonly IDictionary<Type, string> SqlServerMap =
new ConcurrentDictionary<Type, string>(
new List<KeyValuePair<Type, string>>
{
new KeyValuePair<Type, string>(typeof(Boolean), "bit"),
new KeyValuePair<Type, string>(typeof(Boolean), "bit"),
new KeyValuePair<Type, string>(typeof(Byte[]), "varbinary(max)"),
new KeyValuePair<Type, string>(typeof(Double), "float"),
new KeyValuePair<Type, string>(typeof(Byte), "tinyint"),
new KeyValuePair<Type, string>(typeof(Int16), "smallint"),
new KeyValuePair<Type, string>(typeof(Int32), "int"),
new KeyValuePair<Type, string>(typeof(Int64), "bigint"),
new KeyValuePair<Type, string>(typeof(Decimal), "decimal"),
new KeyValuePair<Type, string>(typeof(Single), "real"),
new KeyValuePair<Type, string>(typeof(DateTime), "datetime2(7)"),
new KeyValuePair<Type, string>(typeof(TimeSpan), "time"),
new KeyValuePair<Type, string>(typeof(String), "nvarchar(MAX)"),
new KeyValuePair<Type, string>(typeof(Guid), "uniqueidentifier")
});
Run Code Online (Sandbox Code Playgroud)