Присвоение значений KeyValuePair - PullRequest
0 голосов
/ 01 октября 2019

Я хочу присвоить статические значения моему объекту KeyValuePair.

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

Но это выдает ошибку метода nooverloaded.

Ответы [ 3 ]

4 голосов
/ 01 октября 2019
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 #:

return new List<KeyValuePair<string, string>>()
{
    new("code1", "value1"),
    new("code2", "value2"),
};
0 голосов
/ 01 октября 2019

Или с помощью 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}")
}

Если вы используете значения внутри (внутри класса), вы можете использовать кортежи.

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}")
}
0 голосов
/ 01 октября 2019

Необходимо учитывать, что свойства Key и Value универсального класса доступны только для чтения, поэтому вы не можете установить их напрямую. Вместо этого вам нужно воспользоваться конструктором класса, чтобы установить нужные пары.



 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;

   }

...