Как получить отфильтрованный элемент по индексу значения в словаре C#?

#c# #arrays #asp.net

Вопрос:

Я пытаюсь написать метод, который должен возвращать значение элемента на основе индекса значения и условия.

Например, в приведенном ниже примере, если я передаю значение индекса как 0, оно должно возвращать ключи и первое значение из целочисленного массива, не имеющего значения 5.

 public static Dictionary<string, int[]> _dict = new Dictionary<string, int[]>()
    {
        {"A", [1,0,3] },
        {"B", [5,1,5] },
        {"C", [7,11,5] },
        {"D", [0,1,5]},
        {"E", [14,0,5] },
        {"F", [5,1,5] }
    };
 

Ожидаемый O/P:

если я передам значение индекса 0 и условие как != 5, то O/P должно быть

     {
        {"A", 1 },
        {"C", 7 },
        {"D", 0 },
        {"E", 14}
    };
 

Комментарии:

1. Какова ваша подпись метода? И что вы пробовали до сих пор?

2. Не могли бы вы, пожалуйста, показать нам свои попытки и то, что у вас не получается?

3. Приведенный выше код не компилируется и является недопустимым.

4. Если вы заинтересованы в получении помощи, предоставление действительного кода-это своего рода хорошее начало. Каждая строка инициализации вашего словаря должна выглядеть примерно так {"A", new []{1,0,3} }, . Когда вы говорите «Ожидаемый O/P:» , что такое O/P?

Ответ №1:

Вы могли бы достичь этого в два этапа:

  1. Получите те предметы, которые не начинаются с 5
 var res = _dict.Where(a => a.Value[0] !=5);
 
  1. Затем заполните новый словарь оставшимися ключами и первой записью в их целочисленном массиве
 foreach(KeyValuePair<string,int[]> keyValuePair in res)
{
    result.Add(keyValuePair.Key, keyValuePair.Value[0]);
}
 

или с помощью LINQ

 result = res.ToDictionary(keyValue => keyValue.Key, keyValue => keyValue.Value[valueIndex]);
 

Полный код будет выглядеть примерно так

 public static Dictionary<string, int[]> _dict = new Dictionary<string, int[]>()
{
    {"A", new int[] {1,0,3 } },
    {"B", new int[] {5,1,5} },
    {"C", new int[] {7,11,5} },
    {"D", new int[] {0,1,5}},
    {"E", new int[] {14,0,5} },
    {"F", new int[] {5,1,5} }
};

static Dictionary<string, int> GetResult(int valueIndex, Func<KeyValuePair<string, int[]>, bool> predicate) =>
            _dict.Where(predicate)
                 .ToDictionary(keyValue => keyValue.Key, keyValue => keyValue.Value[valueIndex]);
 

GetResult(valueIndex: 0, predicate: a => a.Value[0] != 5) затем дает желаемый результат

 {
    {"A", 1 },
    {"C", 7 },
    {"D", 0 },
    {"E", 14}
};
 

Комментарии:

1. Когда индекс не существует в массиве, он выдаст ошибку IndexOutOfRangeException . Было бы лучше сначала проверить это.

Ответ №2:

Код одной строки с использованием LINQ

 var result = _dict.Where(x => x.Value[0] != 5).ToDictionary(x => x.Key, y => y.Value[0]);