2009-11-30 21 views
37

Estoy usando un System.Collections.Generic.Dictionary<string, string>.Obtener la primera clave del Diccionario <cadena, cadena>

Quiero devolver la primera clave de este diccionario. Intenté dic.Keys[0] pero lo único que tengo en la propiedad Keys (que es un objeto KeyCollection) es un enumerador.

¿Tengo que enumerar todas las teclas para obtener la primera?

+0

ya que muchos de ustedes han dicho, no hay 'primero'. Tenía que aclararme un poco más: puede especificar una región en una cadena de consulta, y verifico si está en mi lista de regios. si no lo es (el usuario edita la cadena de consulta), simplemente lo configuro en la 'primera' región que se conoce. – Michel

+0

Posible duplicado de [Obtener el primer elemento de un diccionario] (http://stackoverflow.com/questions/13979966/get-first-element-from-a-dictionary) –

+0

@MichaelFreidgeim Eso podría ser un duplicado, pero esta pregunta era preguntado 3 años antes, entonces realmente no podría ser un duplicado. – Michel

Respuesta

83

Suponiendo que está utilizando .NET 3.5:

dic.Keys.First(); 

Tenga en cuenta que no hay ninguna garantía de orden en el que los pares clave/valor se repiten a lo largo de un diccionario. Puede encontrar que en lotes de casos obtiene la primera clave que coloca en los diccionarios, pero absolutamente no se debe. Como dice Skirwan, en realidad no existe la noción de "primero". Básicamente, lo anterior le dará "una clave del diccionario", eso es todo lo que está garantizado.

(Si no sabe si el diccionario está vacío o no, se puede usar FirstOrDefault.)

+0

nice, did not see it in intellisense, así que pensé que era un objeto no-linq-able (lazy me :) – Michel

+2

¿cómo lo haces? haz esto en .NET 2 y anteriores – ina

+0

@ina: puedes escribir fácilmente un método 'First()', que solo usa 'foreach' con una instrucción return in. Pero te recomiendo encarecidamente que actualices si at * all * posible ... la diferencia en productividad cuando tienes LINQ disponible es enorme ... –

9

parece un poco exagerado, pero ¿qué hay

foreach (<Type> k in dic.Keys) 
    return k; 
22

La idea de 'primero' no se aplica realmente a un diccionario, ya que no hay pedidos en las entradas; cualquier inserción o eliminación tiene permitido cambiar radicalmente el orden de las teclas.

+3

+1 para corregir. Ordenar en un diccionario no está garantizado. Quizás un SortedDictionary sería más útil. –

+0

idem dito ---------- (al menos 15 caracteres) – Michel

11

En primer lugar, no, usted no tiene que enumerar todas las entradas - sólo enumerar el primer artículo:

IEnumerator enumerator = dictionary.Keys.GetEnumerator(); 
enumerator.MoveNext(); 
object first = enumerator.Current; 

ideal sería comprobar que el MoveNext() sucedió en realidad (que devuelve un bool) de lo contrario la llamada a la actual puede arrojar.

Tenga también en cuenta que no se especifica el orden de un dicitonario. Esto significa que el 'primer' elemento de hecho puede ser cualquier tecla, puede ser diferente en llamadas posteriores (aunque en la práctica no) y sin duda cambiará a medida que se agreguen y eliminen elementos del diccionario.

+0

+1 para la explicación de la orden – Michel

2

podemos usar la tecnología linq

var key = dic.Take(1).Select(d => d.Key).First() 

o podemos utilizar otra búsqueda

var myList = dic.Take(1).Where(d => d.Key.Contains("Heaven")).ToList(); 
Cuestiones relacionadas