Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该先存储需要转换为变量的数据吗?或者多次调用字典索引器?_C#_.net_Dictionary_Memory Management_Collections - Fatal编程技术网

C# 我应该先存储需要转换为变量的数据吗?或者多次调用字典索引器?

C# 我应该先存储需要转换为变量的数据吗?或者多次调用字典索引器?,c#,.net,dictionary,memory-management,collections,C#,.net,Dictionary,Memory Management,Collections,我真的不知道如何表达这一点,但我对性能感到困惑 我有从字典中读取的变量。但有时它可以包含null 例如,我有以下几点: Dictionary<string,object> DataRow = new Dictionary<string,object>(); 我觉得前面的代码还可以,性能也不错。但这不是可读性。我有超过25个变量。我只举一个简单的例子 为什么不使用下面的方法呢?第二种方法 请注意,前一行将调用字典索引器两次。我想这又在字典里查到了。这是你的表现吗 我应该使

我真的不知道如何表达这一点,但我对性能感到困惑

我有从字典中读取的变量。但有时它可以包含null

例如,我有以下几点:

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));
        }
    }