【问题标题】:Setting dictionary key and value types with variables使用变量设置字典键和值类型
【发布时间】:2015-07-13 06:57:21
【问题描述】:

我目前正在努力创建字典。我想创建它,以便它可以在多种情况下使用。但是,这些情况因键和值类型而异。所以虽然你通常这样做:

Dictionary<int, string> Something = new Dictionary<int, string>();

我想做这样的事情:

Dictionary<variable1, variable2> ..............

variable1 是什么并不重要。它可以是一个字符串,存储 'string' 或 'int' 作为值。我还可以使用 variable1.getType() 来确定类型。无论哪种方式都对我有用。但是我上面做的方式,嗯,那是不正确的。必须有另一种方法来根据变量设置键和值类型...对吗?

我脑子里突然冒出一些东西,使用 if 来检查类型是什么,并根据类型使字典使用该类型。但是随着类型的数量,它将会有很多 if's,我觉得必须有更好的方法。

搜索对我帮助不大。好吧,我学到了一些其他的东西,但没有解决我的问题。在每种情况下,字典 TKeyTValue 都是手动设置的。虽然我想设置它们,但使用我从某个来源获取的变量。

【问题讨论】:

  • 我想这已经回答了Here
  • 为键创建一个类,并将所需的所有字段存储在键类中。时间
  • 为什么要这样做?我认为你有一个XY问题。见meta.stackexchange.com/a/66378/144156
  • @Enigmativity 为什么我想这样做?我正在尝试创建一个包含索引(键)和行数据(类)的字典。现在这些索引属于不同的类型。大多数是整数,如 ID。但在某些情况下,键是字符串。现在我试图从数据库中取出多个表,应用程序正在读取结构,现在应用程序根据他收到的信息创建所有内容。这样我就不必写出所有内容,或者在发生更改时,我必须更改数据库和应用程序。
  • @Verkade89 - 听起来你需要Dictionary&lt;object, row-data&gt;(不管row-data实际上是什么)。

标签: c# dictionary


【解决方案1】:

必须有另一种方法来设置键和值类型基于 变量...对吗?

是的,有。您可以创建一个创建字典的辅助方法,例如:

public static Dictionary<K, V> CreateDictionaryFor<K, V>(K key, V value)
{
    return new Dictionary<K, V>();
}

然后,您可以将其与variable1variable2 一起使用:

var dictionary = CreateDictionaryFor(variable1, variable2);

【讨论】:

  • 这确实很神奇。我从 CreateDictionaryFor 得到正确的字典。奇怪的是,它必须以这种方式完成,并且(不能)直接完成。
【解决方案2】:

你可以试试Dictionary&lt;object, object&gt;

这样你就可以传递你需要传递的任何东西,并根据需要检查类型。

var dict = new Dictionary<object, object>();

dict.Add(45, "dkd");

【讨论】:

  • 你确定对象会起作用吗?适用于所有类型?我不这么认为。
  • @M.kazemAkhgary 所有类型都继承自object,所以它会。
  • 不错。我的想法是使用动态。但似乎对象有效。但你必须始终投射一个给定的值。
  • @M.kazemAkhgary 这是他要求的一部分.. 他并不担心每个实例都调用GetType
  • 这确实是一种解决方案。但是,我注意到使用它后内存使用量增加了很多,这有点令人担忧。因为字典包含很多键/值。
【解决方案3】:

一种可能性是将字典封装在一个新类中,并通过通用方法创建字典:

public class GenericDictionary
{
    private IDictionary m_dictionary;

    public bool Add<TA, TB>(TA key, TB value)
    {
        try
        {
            if (m_dictionary == null)
            {
                m_dictionary = new Dictionary<TA, TB>();
            }

            //check types before adding, instead of using try/catch
            m_dictionary.Add(key, value);

            return true;
        }
        catch (Exception)
        {
            //wrong types were added to an existing dictionary
            return false;
        }
    }
}

当然上面的代码需要一些改进(添加错误类型时也不例外,实现你需要的字典方法的附加方法),但是思路应该很清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    相关资源
    最近更新 更多