Получить первый элемент из словаря
У меня есть следующее объявление:
Dictionary<string, Dictionary<string, string>> like = new Dictionary<string, Dictionary<string, string>>();
Мне нужно вывести первый элемент, но не знаю ключа или значения. Какой лучший способ сделать это?
Ответы
Ответ 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;
}