为 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}")
}
我想为我的 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}")
}