【问题标题】:How can I create a keyvaluepair with a value two different data types?如何创建具有两种不同数据类型的值的键值对?
【发布时间】:2017-03-03 20:33:51
【问题描述】:

我写了一个返回的方法

List<KeyValuePair<CommandType, List<string>>>

CommandType 的类型为 enum

public enum CommandType
{
    Programmed,
    Manual
}

我的问题是KeyValuePair 中的值有时是enum,有时是字符串列表,但我需要将所有KeyValuePair 保留在一个列表中。

目前,我将值作为 keyvaluepair 中的对象传递,当方法返回列表并迭代它时,基于键,我将值转换回其原始类型。

有没有更好的方法来实现这一点?

这是一个示例代码

public enum  ProgrammedCommands
{
    Sntp,
    Snmp,
}
private List<KeyValuePair<CommandType, object>> GetCommandsFromTemplate(string[] templateLines)
{
    var list = new List<KeyValuePair<CommandType, object>>();

    if (templateLines != null)
        for (int lineIndex = 0; lineIndex < templateLines.Length; lineIndex++)
        {
            if (templateLines[lineIndex].Contains("!*") && templateLines[lineIndex].Contains("*!"))
            {
                KeyValuePair<CommandType, object> ProgrammedSetting;
                List<string> programmedCommandList;
                if (templateLines[lineIndex].Contains("SNTP - SNTP Server Commands"))
                {

                    ProgrammedSetting = new KeyValuePair<CommandType, object>(CommandType.Programmed, ProgrammedCommands.Sntp);
                    list.Add(ProgrammedSetting);
                }

                else if (templateLines[lineIndex].Contains("MANUAL"))
                {
                    lineIndex++;
                    List<string> manual = new List<string>();
                    while (true)
                    {
                        if (lineIndex >= templateLines.Length)
                            break;
                        if (templateLines[lineIndex].Contains("!!["))
                            lineIndex++;
                        else if (templateLines[lineIndex].Contains("]!!"))
                            break;
                        else
                        {
                            manual.Add(templateLines[lineIndex]);
                            lineIndex++;
                        }
                    }
                    ProgrammedSetting = new KeyValuePair<CommandType, object>(CommandType.Manual, manual);
                    list.Add(ProgrammedSetting);
                }
            }
        }
    return list;
}

【问题讨论】:

  • 您在寻找Dictionary&lt;object, object&gt; 还是List&lt;KeyValuePair&lt;object,object&gt;&gt;
  • 编写一个具有您需要的属性的类并返回一个List&lt;T&gt;。你所拥有的东西很难阅读,也很难维护。这是你的生活,但只要你处理这段代码,你就会以无休止的麻烦为代价节省一点时间。 KeyValuePair 在这里是一个非常不合适的选择。
  • @EdPlunkett 我来这里是为了学习,“疯狂”这个词并没有教给我任何东西。但是像这样的词:效率不高,做法不好……加上一些简短的解释可以教很多东西。
  • @EdPlunkett a List 不会解决问题,因为当我初始化要添加项目的列表时,我需要将 T 设置为 ProgrammedCommandList&lt;string&gt;,因此不能将两种类型添加到同一个列表中。我想我需要创建一个具有两个属性的类,一个ProgrammedCommand 和一个object 类型的第二个属性,然后我可以维护一个从该类实例化的对象列表,这将使代码更清晰。我需要做的就是按顺序遍历列表,仅此而已!所以感谢@EdPunkett 的建议,感谢@Reza Aghaei 的帮助
  • @kat1330 1) 用户没有尝试存储enumstring。他正在尝试存储enumList&lt;String&gt;,因此使用string 没有意义。 2) 当您可以使用对象来装箱/拆箱值时,将枚举存储为字符串并将它们从字符串转换回来似乎效率不高。 3) 有时,根据某人的意见,解决方案是丑陋或尴尬的,因为它们似乎没有任何附加价值。 4) 毕竟,对我来说,你似乎更多的是被冒犯而不是对真正的原因感到好奇。这就是为什么我给你写了一个评论,如果你不喜欢它,请忽略它:)

标签: c# .net winforms


【解决方案1】:

如果你想为不同的类型使用一个存储,因为值的类型只能在运行时确定,那么你应该使用object类型来装箱值,然后当你需要使用一个值时以类型化的方式,检查其类型并将其拆箱为所需的类型并使用它。

因此,您可以根据自己的要求使用以下数据结构之一:

  • Dictionary&lt;CommandType, object&gt; ← 密钥应该是唯一的。
  • List&lt;KeyValuePair&lt;CommandType, object&gt;&gt; ←pair的key不需要唯一。

注意:您可能可以想象一些解决方案,例如创建一个公共基类 BaseType 并从 BaseType 派生两个不同的 ListContainerEnumContainer 并创建 ListContainer 和 @987654329 @ 在运行时并存储在 Dictionary&lt;CommandType, BaseType&gt; 中。这样的结构可能只是可以帮助您将存储限制为所需的类型,而不是使用对象。

【讨论】:

    猜你喜欢
    • 2019-03-17
    • 2013-04-25
    • 2013-01-18
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    相关资源
    最近更新 更多