Подтвердить что ты не робот

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

У меня есть следующее объявление:

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

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

4b9b3361

Ответ 1

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


Просто используйте 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();

Ответ 2

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

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)

Ответ 3

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

Ответ 4

EDIT: Используйте OrderedDictionary.

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

Пример:

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

Ответ 5

Словарь

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

Ответ 6

Dictionary<string, Dictionary<string, string>> like = new Dictionary<string, Dictionary<string, string>>();
Dictionary<string, string> first = like.Values.First();

Ответ 7

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

 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;
 }