Как отображать / выводить / манипулировать содержимым словаря? - PullRequest
0 голосов
/ 16 мая 2019

Мне нужно отобразить List из Dictionary на основе int key, который я ввел в консоль, и throw сообщение об ошибке, если оно выходит за пределы заданных границ входов в консоли..

public class Channel
{
    const string displayChannel = "{0},{1},{2}";

    private Dictionary <int, string> ChannelLookup = 
    new Dictionary <int, string> ()
    {
        {1, new List<string>{"[A]","[B]","[C]"}},
        {2, new List<string>{"[A]"}
    };

    public string channelDisplay (int val)
    {
        if (!ChannelLookup.ContainsKey(val))
        {
            // throw exception
        }
        else
        {
            string display = string.Format(displayChannel, ChannelLookup[val]);
            return display;
        }
    }
}

System.Format.Exception: 'Индекс (с нулями) должен быть больше или равен нулю и меньше размера списка аргументов.

Ответы [ 3 ]

2 голосов
/ 16 мая 2019

Просто для полноты: иногда я использую Aggregate вместо Join, поскольку это дает вам больше контроля.

var values = ChannelLookup[val].Values;
var display = values.Aggregate((a, b) => $"{a}, {b}");

Чтобы использовать функцию Linq Aggregate, вам необходимо добавить System.Linq к вашим директивам использования.

1 голос
/ 16 мая 2019

Вы должны отобразить произвольное количество элементов (скажем, 3 - "[A]", "[B]", "[C]" или просто 1 - "A"); давайте Join их вместо использования Format

public class Channel {
  private Dictionary <int, List<string>> ChannelLookup = 
    new Dictionary <int, List<string>> () {
      {1, new List<string>() {"[A]", "[B]", "[C]"} },
      {2, new List<string>() {"[A]"} },
    };

  public string channelDisplay (int key) {
    if (ChannelLookup.TryGetValue(key, out var items))
      return string.Join(",", items);
    else 
      throw new ArgumentException($"{nameof(key)} = {key} not found", nameof(key));
  }
}

Или даже

public string channelDisplay(int key) => ChannelLookup.TryGetValue(key, out var items)
  ? string.Join(",", items)
  : throw new ArgumentException($"{nameof(key)} = {key} not found", nameof(key));
0 голосов
/ 16 мая 2019

.NET не позволяет использовать неиспользуемые параметры формата, т. Е. Вы не можете сделать это string.Format("{0},{1}", "first value") без указания значения {1}.

Ваша лучшая ставка здесь, вероятно, строка. string.Join объединит указанные вами значения, поместив указанный разделитель между каждым значением.

Смотри документы здесь

public class Channel
{
 private Dictionary <int, string> ChannelLookup = 
 new Dictionary <int, string> ()
 {
  {1, new List<string>{"[A]","[B]","[C]"}},
  {2, new List<string>{"[A]"}
 };

 public string channelDisplay (int val)
 {
  if(!ChannelLookup.ContainsKey(val))
  {
    // throw exception
  }
  else
  {
    string display = string.Join(",", ChannelLookup[val]);
    return display;
  }
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...