C# 我应该先存储需要转换为变量的数据吗?或者多次调用字典索引器?
我真的不知道如何表达这一点,但我对性能感到困惑 我有从字典中读取的变量。但有时它可以包含null 例如,我有以下几点:C# 我应该先存储需要转换为变量的数据吗?或者多次调用字典索引器?,c#,.net,dictionary,memory-management,collections,C#,.net,Dictionary,Memory Management,Collections,我真的不知道如何表达这一点,但我对性能感到困惑 我有从字典中读取的变量。但有时它可以包含null 例如,我有以下几点: Dictionary<string,object> DataRow = new Dictionary<string,object>(); 我觉得前面的代码还可以,性能也不错。但这不是可读性。我有超过25个变量。我只举一个简单的例子 为什么不使用下面的方法呢?第二种方法 请注意,前一行将调用字典索引器两次。我想这又在字典里查到了。这是你的表现吗 我应该使
Dictionary<string,object> DataRow = new Dictionary<string,object>();
我觉得前面的代码还可以,性能也不错。但这不是可读性。我有超过25个变量。我只举一个简单的例子
为什么不使用下面的方法呢?第二种方法
请注意,前一行将调用字典索引器两次。我想这又在字典里查到了。这是你的表现吗
我应该使用第一种方法还是第二种方法?为什么
注意,我有超过25个变量。所以我试着在阅读时找出哪一个是好的表现?这有关系吗
请参阅参考.NET源代码。索引器调用时总是执行循环
public TValue this[TKey key] {
get {
int i = FindEntry(key);
if (i >= 0) return entries[i].value;
ThrowHelper.ThrowKeyNotFoundException();
return default(TValue);
}
set {
Insert(key, value, false);
}
}
private int FindEntry(TKey key) {
if( key == null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);
}
if (buckets != null) {
int hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF;
for (int i = buckets[hashCode % buckets.Length]; i >= 0; i = entries[i].next) {
if (entries[i].hashCode == hashCode && comparer.Equals(entries[i].key, key)) return i;
}
}
return -1;
}
我对表演的看法是,没关系。与访问数据库相比,C的速度有多快基本上无关紧要 我对可读性的看法是: 您应该有一个函数,用于从数据行读取每种类型的值,并将其转换为正确的类型:
var StudioId = ReadAsInt(DataRow["StudentId"]);
var IsPaid = ReadAsBoolean(DataRow["IsPaid"]);
比你的版本更容易阅读。当然,您将需要这些函数,因此类似于:
int ReadAsInt(object value)
{
return value is null ? 1 : Convert.ToInt32(value);
}
int ReadAsBool(object value)
{
return value is null ? true : Convert.ToBoolean(value);
}
或者使用通用版本
第三种方法使用一些轻量级的ORM,我试图找出哪一种在阅读时表现良好?这有关系吗?只有您或您的用户可以回答这个问题。hmmm您有一些类似于选择StudentID、StudentName、IsPaid FROM表的内容,您可以将其存储在DataTableprolly in DataSet中。。。所以实际上,您可能还有IEnumerable where类YourDataRow{public int StudentID{get;set;}public bool?IsPaid{get;set;}public string StudentName{…}。。。使用一些LightweightORM,您可以像connection.Querysql或connection.QueryFirstOrDefaultsql一样获得它,如果您只需要一个OK。。。在写入字典时设置默认值,而不是在读取时设置默认值。。。或者更好-使用具有所有必需属性的自定义数据类OK,直到我应该使用ReadAsInt,而不是使用泛型版本,否则没关系?泛型更好,主要是因为维护一个函数比维护一个类型更容易完成所有任务。
var StudioId = ReadAsInt(DataRow["StudentId"]);
var IsPaid = ReadAsBoolean(DataRow["IsPaid"]);
int ReadAsInt(object value)
{
return value is null ? 1 : Convert.ToInt32(value);
}
int ReadAsBool(object value)
{
return value is null ? true : Convert.ToBoolean(value);
}
public static class Conversion
{
public static T Read<T>(object Value, T DefaultValue = default(T))
{
if (Value is null || Value is DBNull)
return DefaultValue;
return (T)Convert.ChangeType(Value, typeof(T));
}
}