it-roy-ru.com

Получить первый элемент из словаря

У меня есть следующая декларация:

Dictionary<string, Dictionary<string, string>> like = new Dictionary<string, Dictionary<string, string>>();

Мне нужно вывести первый элемент, но я не знаю ключ или значение. Какой лучший способ сделать это?

34
cdub

Обратите внимание, что для вызова First здесь фактически нужно вызвать расширение Linq для IEnumerable, которое реализуется Dictionary<TKey,TValue>. Но для словаря «первый» не имеет определенного значения. Согласно этот ответ , последний добавленный элемент в конечном итоге становится "первым" (другими словами, он ведет себя как Stack), но это зависит от реализации, это не гарантированный поведение. Другими словами, для предположить вы получите любой определенный элемент, вызвав First будет означать попрошайничество - использовать его следует как сродни получению элемента random из словаря, как отметил Бобсон ниже. Однако иногда это полезно, так как вам просто нужен любой элемент из Словаря.


Просто используйте Linq First():

var first = like.First();
string key = first.Key;
Dictionary<string,string> val = first.Value;

Обратите внимание, что использование First в словаре дает вам KeyValuePair, в данном случае KeyValuePair<string, Dictionary<string,string>>.


Также обратите внимание, что вы могли бы получить конкретное значение от использования First, объединив его с Linq OrderBy:

var first = like.OrderBy(kvp => kvp.Key).First();
80
McGarnagle

Для тех, кто придет к этому, и хочет получить linq-less способ получить an элемент из словаря

var d = new Dictionary<string, string>();
d.Add("a", "b");
var e = d.GetEnumerator();
e.MoveNext();
var anElement = e.Current;
// anElement/e.Current is a KeyValuePair<string,string>
// where Key = "a", Value = "b"

Я не уверен, что это зависит от реализации, но если в вашем словаре нет элементов, Current будет содержать KeyValuePair<string, string>, где ключ и значение - null.

(Я посмотрел на логику метода linq First, чтобы придумать это, и протестировал его с помощью LinqPad 4)

18
JesseBuesking

Хотя вы можете использовать First(), словари сами по себе не имеют порядка. Пожалуйста, используйте OrderedDictionary вместо. И тогда вы можете сделать FirstOrDefault. Таким образом, это будет иметь смысл.

14
RAS

Правка: Использовать OrderedDictionary.

Лучше использовать FirstOrDefault() для получения первого значения.

Пример:

var firstElement = like.FirstOrDefault();
string firstElementKey = firstElement.Key;
Dictinary<string,string> firstElementValue = firstElement.Value;
4
naren.katneni

Словарь не определяет порядок пунктов. Если вам просто нужен элемент, используйте свойства Keys или Values словаря, чтобы выбрать его.

2
Alexei Levenkov
Dictionary<string, Dictionary<string, string>> like = new Dictionary<string, Dictionary<string, string>>();
Dictionary<string, string> first = like.Values.First();
1
Agustin Meriles

я не найду простой способ найти первый элемент в словаре :)

 Dictionary<string, Dictionary<string, string>> like = 
 newDictionary<string,Dictionary<string, string>>();

 foreach(KeyValuePair<string, Dictionary<string, string>> _element in like)
 {
   Console.WriteLine(_element.Key); // or do something
   break;
 }
0
Levris First