为 KeyValuePair 赋值

Assigning Values to KeyValuePair

我想为我的 KeyValuePair 对象分配一些静态值。

private IEnumerable<KeyValuePair<string, string>> getCountries()
{
    return new List<KeyValuePair<string, string>>() 
    { 
      { "code1", "value1" }, 
      { "code2", "value2" } 
    };
}

但这是抛出 nooverloaded 方法错误。

return new List<KeyValuePair<string, string>>()
{
    new KeyValuePair<string, string>("code1", "value1"),
    new KeyValuePair<string, string>("code2", "value2"),
};

如果您使用的是 .NET Core 2.0+,则可以使用稍微不那么冗长的语言:

return new List<KeyValuePair<string, string>>()
{
    KeyValuePair.Create("code1", "value1"),
    KeyValuePair.Create("code2", "value2"),
};

在 C# 9 中,您可以使用目标类型的 new 将其写为:

return new List<KeyValuePair<string, string>>()
{
    new("code1", "value1"),
    new("code2", "value2"),
};

需要考虑泛型class的Key和Value属性都是只读的,不能直接设置。相反,您需要利用 class 的构造函数来设置所需的对。



 public IEnumerable<KeyValuePair<string, string>> getCountries()
  {
        var keyValue1 = new KeyValuePair<string,string>("code1","value1");
        var keyvalue2 = new KeyValuePair<string,string>("code2","value2");

        var keyValueList = new List<KeyValuePair<string, string>> {keyValue1, keyvalue2};
        return keyValueList;

   }

或者使用Dictionary你可以实现想要的初始化风格

var pairs = new Dictionary<string, string>
{
    { "one", "first" },
    { "two", "second" },
}.ToList();

pairs.Should().BeOfType<List<KeyValuePair<string, string>>>(); // Pass

注意,如果稍后在代码中您打算枚举键值对列表,那么您可以使用字典而无需显式将其转换为列表。

var pairs = new Dictionary<string, string>
{
    { "one", "first" },
    { "two", "second" },
}

// later somewhere in the code

foreach(var pair in pairs)
{
    Console.WriteLine($"{pair.Key}: {pair.Value}")
}

如果您在内部使用值(在 class 内),您可以使用元组。

private IEnumerable<(string Code, string Name)> GetCountries()
{
    yield return ("code", "Earth");
    yield return ("code", "Vulkan");
}

稍后可以以更易读的方式使用

foreach(var country in GetCountries())
{
    Console.WriteLine($"{country.Code}: {country.Name}")
}

如果跨应用程序使用类型,那么您可以向代码的读者展示代码的意图并创建自定义类型,而不是使用键值对。

public class Country
{
    public string Code { get; }
    public string Name { get; }

    public Country(string code, string name)
    {
        Code = code;
        Name = name;
    }
}

private IEnumerable<Country> GetCountries()
{
    yield return new Country("code", "Earth");
    yield return new Country("code", "Vulkan");
}

稍后可以以更易读的方式使用

foreach(var country in GetCountries())
{
    Console.WriteLine($"{country.Code}: {country.Name}")
}