c# List‹KeyValuePair› Получить значение по ключу или индексу

Как получить значение по ключу для keyKeyValuePair

У меня есть List<KeyValuePair<string, string>>

var dataList = new List<KeyValuePair<string, string>>();

// Adding data to the list
dataList.Add(new KeyValuePair<String, String>("name", "foo"));
dataList.Add(new KeyValuePair<String, String>("name", "bar"));
dataList.Add(new KeyValuePair<String, String>("age", "24"));

Создание цикла для этого списка:

foreach (var item in dataList) {
    string key = item.Key;
    string value = item.Value;
}

Что я пытаюсь сделать, так это получить string name = item["name"].Value примерно так:

foreach (var item in dataList) {
    // Print the value of the key "name" only
    Console.WriteLine(item["name"].Value);

    // Print the value of the key "age" only
    Console.WriteLine(item["age"].Value);
}

Или, возможно, получить значение по индексу, например Console.WriteLine(item[0].Value)

Как я мог этого добиться?

Примечание. Мне нужно использовать только один foreach, чтобы не использовать отдельный foreach для каждого ключа.

Изменить 1, если я использовал if(item.Key == "name") { // do stuff }, я не смогу использовать другие ключи в этом статусе if, поэтому мне нужно работать в этой логике:

if(item.Key == "name") {
    // Print out another key
    Console.WriteLine(item["age"].Value)

    // and that will not work because the if statment forced to be the key "name" only
}

Редактировать 2 Я пытался использовать Словарь и добавлять в него данные, например:

dataList.Add("name", "john");
dataList.Add("name", "doe");
dataList.Add("age", "24");

и он говорит An item with the same key has already been added., и я думаю, потому что я добавляю несколько элементов с одним и тем же ключом "name", и мне нужно это сделать.

Редактировать 3 Чего я пытаюсь достичь instead of how i try to do it :

Я пытаюсь просмотреть список и сделать условие, если элемент с файлом ключа path существует или нет:

if(File.Exists(item["path"]) { Console.WriteLine(item["name"]) }

// More Explained

foreach (var item in dataList) {
    if (File.Exists(//the key path here//)) {
        MessageBox.Show("File //The key name here// exists.");
    }else {
        MessageBox.Show("File //The key name here// was not found.");
    }
}

и проблема в том, что я не могу использовать item["path"] таким образом.. все, что я могу сделать, это item.Key & item.Value


person Amr SubZero    schedule 01.03.2018    source источник
comment
Есть ли причина, по которой у вас List вместо Dictionary<string, string>? Ваш вариант использования поиска по ключу выглядит так, как будто вам на самом деле не нужен список.   -  person Joe Enos    schedule 01.03.2018
comment
у вас есть пример использования Dictionary<string, string>, потому что я пытался его использовать, но он сказал, что есть еще элементы с одним и тем же ключом? я хочу иметь несколько элементов с одним и тем же ключом. если это возможно, моя проблема будет решена.   -  person Amr SubZero    schedule 01.03.2018
comment
На данный момент это действительно похоже на проблему XY. Почему бы вам не сделать шаг назад и не объяснить точно что вы пытаетесь сделать вместо как вы пытаетесь это сделать?   -  person 41686d6564    schedule 01.03.2018
comment
я обновил вопрос, можете ли вы прочитать часть Редактировать 3, пожалуйста?   -  person Amr SubZero    schedule 01.03.2018
comment
Являются ли ключевые имена гибкими или фиксированными?   -  person Erlangga Hasto Handoko    schedule 01.03.2018
comment
Ключи фиксированы, но значения гибки.   -  person Amr SubZero    schedule 01.03.2018
comment
Если я вас правильно понял, то вы делаете это неправильно. Список KeyValuePair не имеет никаких отношений между его элементами. Что вы можете сделать, так это создать класс и добавить к нему все свойства, которые вы хотите (путь, имя и т. д.), а затем вы можете создать список этого класса. Еще одна вещь, которую вы можете сделать, если речь идет только о путях и именах файлов, — это использовать FileInfo вместо создания собственного класса.   -  person 41686d6564    schedule 01.03.2018
comment
Создайте класс со свойствами имени, возраста и пути, а затем создайте общий список этого класса. Хотел бы я дать вам образец. Но тем не менее эта тема закрыта.   -  person Erlangga Hasto Handoko    schedule 01.03.2018
comment
Я считаю, что этот вопрос не является дубликатом, потому что другой вопрос не дает ответов, связанных с моей проблемой. в любом случае спасибо ребятам за помощь.   -  person Amr SubZero    schedule 01.03.2018
comment
Он был помечен как дубликат, потому что вы исказили свой вопрос (например, проблема XY). На данный момент я не думаю, что редактирование вопроса поможет. Кроме того, я считаю, что достаточно использовать класс FileInfo или создать свой собственный (в зависимости от того, какие свойства вам нужны). Если вы все еще не можете понять это, вы можете задать другой вопрос и объяснить свои фактические требования.   -  person 41686d6564    schedule 01.03.2018


Ответы (1)


Вы можете запустить запрос foreach только по нужным ключам:

foreach ( var item in dataList.Where( i => i.Key == "name" ) )
{
    //use name items
}

При этом используется LINQ для включения только KeyValuePairs, где Key равно "name". Вам нужно будет добавить using System.Linq в начало файла исходного кода, чтобы это работало правильно.

person Martin Zikmund    schedule 01.03.2018
comment
Я добавил примечание к вопросу, пожалуйста, прочитайте его. - person Amr SubZero; 01.03.2018
comment
Я не понимаю вопроса. Если вы хотите использовать только один foreach, то каждый раз вы будете получать только один элемент, поэтому вы можете просто сделать что-то вроде if ( item.Key == "name" ) ... else ...? - person Martin Zikmund; 01.03.2018
comment
if(item.Key == "name") { Console.WriteLine(another key) } если я заставил его указать имя ключа .. вставьте, что я не могу получить другие ключи, мне нужно использовать несколько ключей в одном и том же foreach вы поняли? - person Amr SubZero; 01.03.2018
comment
Проблема в том, что нет никакой связи между именем и возрастом. dataList — это просто список значений. Первое имя, второе имя, третье возраст. Между ними нет связи. Если вы хотите как-то связать их, вы должны создать собственный класс со свойствами Name и Age, а затем составить их список. - person Martin Zikmund; 01.03.2018
comment
Пожалуйста, прочтите часть Редактировать 3 вопроса. - person Amr SubZero; 01.03.2018