C# 在C中创建一个简单的名称-值映射器类#

C# 在C中创建一个简单的名称-值映射器类#,c#,C#,我想创建一个类(static?),它只是将一个名称映射到一个值(1对1)。这样做的干净方式是什么: public static class FieldMapper { public static GetValue(string Name) { if (Name == "abc") return "Value1"; if (Name == "def") return "Value2"; } } //Name Spaces Requir

我想创建一个类(static?),它只是将一个名称映射到一个值(1对1)。这样做的干净方式是什么:

public static class FieldMapper
{
  public static GetValue(string Name)
  {
    if (Name == "abc")
        return "Value1";

    if (Name == "def")
        return "Value2";
  }
}
//Name Spaces Required
using System.Resources;
using System.Reflection;

// Create the resource manager.
Assembly assembly = this.GetType().Assembly;

//ResFile.Strings -> <Namespace>.<ResourceFileName i.e. Strings.resx>
resman = new ResourceManager("StringResources.Strings", assembly);

// Load the value of string value for Client
strClientName = resman.GetString("Client");
我今天可能有思维障碍。对于这样一个简单的问题,我想不出一个干净的解决方案:(

编辑:
所有的值在编译时都是已知的(没有唯一性-不同的键可以映射到相同的值)。我不应该创建在运行时添加值的数据结构。此外,我希望避免使用XML文件听起来像是字典的工作

Dictionary<string, string> values = new Dictionary<string, string>();
values.Add("abc", "Value1");
values.Add("def", "Value2");
Console.WriteLine(values["abc"]);   // Prints "Value1"
字典值=新字典();
价值。添加(“abc”、“价值1”);
价值。添加(“定义”、“价值2”);
Console.WriteLine(值[“abc”]);//打印“值1”

听起来像是字典的工作

Dictionary<string, string> values = new Dictionary<string, string>();
values.Add("abc", "Value1");
values.Add("def", "Value2");
Console.WriteLine(values["abc"]);   // Prints "Value1"
字典值=新字典();
价值。添加(“abc”、“价值1”);
价值。添加(“定义”、“价值2”);
Console.WriteLine(值[“abc”]);//打印“值1”
您描述的是一个数据结构。这些数据结构通常使用

C#已经实现了这种类型的数据结构。请参阅。

您正在描述的数据结构。这些数据结构通常使用


C#已经实现了这种类型的数据结构。请参阅。

如果您谈论的是编译时已知的值,可以尝试将它们存储为资源。类似于以下内容:

public static class FieldMapper
{
  public static GetValue(string Name)
  {
    if (Name == "abc")
        return "Value1";

    if (Name == "def")
        return "Value2";
  }
}
//Name Spaces Required
using System.Resources;
using System.Reflection;

// Create the resource manager.
Assembly assembly = this.GetType().Assembly;

//ResFile.Strings -> <Namespace>.<ResourceFileName i.e. Strings.resx>
resman = new ResourceManager("StringResources.Strings", assembly);

// Load the value of string value for Client
strClientName = resman.GetString("Client");
//需要名称空间
利用系统资源;
运用系统反思;
//创建资源管理器。
Assembly Assembly=此.GetType().Assembly;
//ResFile.Strings->。
resman=newresourcemanager(“StringResources.Strings”,assembly);
//为客户端加载字符串值的值
strClientName=resman.GetString(“客户端”);

(从中窃取)

如果您谈论的是编译时已知的值,您可以尝试将它们存储为资源。类似如下:

public static class FieldMapper
{
  public static GetValue(string Name)
  {
    if (Name == "abc")
        return "Value1";

    if (Name == "def")
        return "Value2";
  }
}
//Name Spaces Required
using System.Resources;
using System.Reflection;

// Create the resource manager.
Assembly assembly = this.GetType().Assembly;

//ResFile.Strings -> <Namespace>.<ResourceFileName i.e. Strings.resx>
resman = new ResourceManager("StringResources.Strings", assembly);

// Load the value of string value for Client
strClientName = resman.GetString("Client");
//需要名称空间
利用系统资源;
运用系统反思;
//创建资源管理器。
Assembly Assembly=此.GetType().Assembly;
//ResFile.Strings->。
resman=newresourcemanager(“StringResources.Strings”,assembly);
//为客户端加载字符串值的值
strClientName=resman.GetString(“客户端”);

(偷来的)

我认为字典会更好,但是,如果你打算用代码来做:

 public static class FieldMapper
{  
     public static GetValue(string Name)  
    {    
       switch (Name)
      {
        case "abc":
         return Value1;
      }
    }
}

我认为字典会更好,但是,如果你打算用代码来做:

 public static class FieldMapper
{  
     public static GetValue(string Name)  
    {    
       switch (Name)
      {
        case "abc":
         return Value1;
      }
    }
}

如果您可以将项目预加载到词典中,这将非常有帮助:

IDictionary<string, string> myValues = new Dictionary<string, string>( 3 )
{
        {"abc", "Value1"},
        {"def", "Value2"},
        {"ghi", "Value3"}
};

var mySearchString = "abc";
return myValues.Keys.Contains( "abc" ) ? myValues[ mySearchString ] : string.Empty;
IDictionary myValues=新字典(3)
{
{“abc”,“Value1”},
{“def”,“Value2”},
{“ghi”、“Value3”}
};
var mySearchString=“abc”;
返回myValues.Keys.Contains(“abc”)?myValues[mySearchString]:string.Empty;

如果您可以将项目预加载到字典中,这将非常有帮助:

IDictionary<string, string> myValues = new Dictionary<string, string>( 3 )
{
        {"abc", "Value1"},
        {"def", "Value2"},
        {"ghi", "Value3"}
};

var mySearchString = "abc";
return myValues.Keys.Contains( "abc" ) ? myValues[ mySearchString ] : string.Empty;
IDictionary myValues=新字典(3)
{
{“abc”,“Value1”},
{“def”,“Value2”},
{“ghi”、“Value3”}
};
var mySearchString=“abc”;
返回myValues.Keys.Contains(“abc”)?myValues[mySearchString]:string.Empty;

如果希望在编译时而不是启动时创建集合,可以使用开关

如果开关包含多个项目(五个IIRC),它将使用哈希查找实现,因此即使您在其中放置了大量案例,它也会非常快。(即,任何案例的访问时间都是相同的。)


如果希望在编译时而不是启动时创建集合,可以使用开关

如果开关包含多个项目(五个IIRC),它将使用哈希查找实现,因此即使您在其中放置了大量案例,它也会非常快。(即,任何案例的访问时间都是相同的。)



从IDictionary继承的类?所有这些值在编译时都是已知的。在.Net 2或更高版本中,System.Collections.Generic.Dictionary是从IDictionary继承的类?所有这些值在编译时都是已知的。在.Net 2或更高版本中,System.Collections.Generic.Dictionaryak可能是字典?如果您投票反对,请告诉我为什么--如果我的ansWER是错误的,我可以更正或删除它们。我没有,但列表不是哈希查找,它不能解决问题。如果您的键和值都是字符串,那么使用资源也不是不可能的。可能是aka字典?如果您投票反对,让我知道原因——如果我的答案是错误的,我可以更正或删除它们。我没有,但列表不是hashlookup,它不能解决问题如果您的键和值都是字符串,那么使用资源也不是不可能的。是否需要指定字典中的元素数,或者这是可选的。虽然我知道设计期间的所有项,但会有多个开发人员更新文件,并且很容易出错,因为他们希望增加每当他们添加一个新的oneRobert右侧时,都会对数字进行重载。字典上有几个重载(以及其他类似的集合类型),其中之一允许您在知道的情况下提前设置项目的数量。此重载是可用的,因为如果您知道该数量,它将使字典更加高效。@Boydski,澄清一下:如果您将大小传递到列表或字典中,则您没有指定大小,而只是指定初始容量。确切地说,这是多少将新项添加到集合中直到集合超过该初始值设定项时的ess开销。重载存在是有原因的。{-o)如果您知道创建词典时所需的容量,当然应该指定它,但如果您不知道,则开销相当低。平均开销是每次向词典中添加项目时复制几个额外的字节,因此几乎不可能注意到。是否需要指定词典中的元素数,或者这是一种选择虽然我知道设计期间的所有项目,但会有几个开发人员更新该文件,而且每当他们添加新的oneRobert时,很容易错误地期望他们增加数量