У меня есть следующее объявление:
Dictionary<string, Dictionary<string, string>> like = new Dictionary<string, Dictionary<string, string>>();
Мне нужно вывести первый элемент, но не знаю ключа или значения. Какой лучший способ сделать это?
У меня есть следующее объявление:
Dictionary<string, Dictionary<string, string>> like = new Dictionary<string, Dictionary<string, string>>();
Мне нужно вывести первый элемент, но не знаю ключа или значения. Какой лучший способ сделать это?
Обратите внимание, что для вызова 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();
Для тех, кто приходит к этому, который хочет использовать 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
)
Хотя вы можете использовать First()
, словари не имеют порядка как такового. Вместо этого используйте OrderedDictionary. И тогда вы можете сделать FirstOrDefault
. Таким образом, это будет иметь смысл.
EDIT: Используйте OrderedDictionary.
Лучше использовать FirstOrDefault()
для получения первого значения.
Пример:
var firstElement = like.FirstOrDefault();
string firstElementKey = firstElement.Key;
Dictinary<string,string> firstElementValue = firstElement.Value;
не определяет порядок элементов. Если вам просто нужен элемент, используйте Keys
или Values
свойства словаря, чтобы выбрать его.
Dictionary<string, Dictionary<string, string>> like = new Dictionary<string, Dictionary<string, string>>();
Dictionary<string, string> first = like.Values.First();
я не найду простой способ найти первый элемент в словаре :)
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;
}