2010-04-14 20 views
140

Tengo un método que devuelve un IEnumerable<KeyValuePair<string, ArrayList>>, pero algunas de las personas que llaman requieren que el resultado del método sea un diccionario. ¿Cómo puedo convertir el IEnumerable<KeyValuePair<string, ArrayList>> en un Dictionary<string, ArrayList> para que pueda usar TryGetValue?Recreando un diccionario de un IEnumerable <KeyValuePair <>>

método:

public IEnumerable<KeyValuePair<string, ArrayList>> GetComponents() 
{ 
    // ... 
    yield return new KeyValuePair<string, ArrayList>(t.Name, controlInformation); 
} 

persona que llama:

Dictionary<string, ArrayList> actual = target.GetComponents(); 
actual.ContainsKey("something"); 
+0

posible duplicado? http://stackoverflow.com/questions/7850334/how-to-convert-ienumerable-of-keyvaluepairx-y-to-dictionary – Coolkau

Respuesta

263

Si está utilizando .NET 3.5 o .NET 4, es fácil para crear el diccionario utilizando LINQ:

Dictionary<string, ArrayList> result = target.GetComponents() 
             .ToDictionary(x => x.Key, x => x.Value); 

No existe tal cosa como IEnumerable<T1, T2> pero KeyValuePair<TKey, TValue> está bien.

+9

Se podría pensar que habría una llamada que no requiere argumentos, dado que Dictionary < TKey, TValue> implementa IEnumerable >, pero bueno. Lo suficientemente fácil como para hacer los tuyos. – Casey

+1

@emodendroket ¿por qué piensas eso? Puede convertir el diccionario directamente al IEnumerable mencionado debido a la interfaz, pero no al revés. es decir, 'IEnumerable >' no implementa ni hereda 'Dictionary '. – djv

+4

@DanVerdolino Lo sé. Pensarías eso porque es como una de las cosas más comunes que querrías hacer con un IEnumerable de KVPs. – Casey

-27

Creación de un objeto Dictionary de Datable usando IEnumerable

using System.Data; 
using .. 


public class SomeClass { 
    //define other properties 
    // ... 

    public Dictionary<string, User> ConvertToDictionaryFromDataTable(DataTable myTable, string keyColumnName) 
     { 
      // define IEnumerable having one argument of KeyValuePair 
      IEnumerable<KeyValuePair<string,User>> tableEnumerator = myTable.AsEnumerable().Select(row => 
       { 
        // return key value pair 
        return new KeyValuePair<string,User>(row[keyColumnName].ToString(),       
         new User 
         { 
          UserID=row["userId"].ToString(), 
          Username=row["userName"].ToString(), 
          Email=row["email"].ToString(), 
          RoleName=row["roleName"].ToString(), 
          LastActivityDate=Convert.ToDateTime(row["lastActivityDate"]), 
          CreateDate=Convert.ToDateTime(row["createDate"]), 
          LastLoginDate=Convert.ToDateTime(row["lastLoginDate"]), 
          IsActive=Convert.ToBoolean(row["isActive"]), 
          IsLockedOut=Convert.ToBoolean(row["isLockedOut"]), 
          IsApproved=Convert.ToBoolean(row["isApproved"]) 
         }); 
       }); 
      return tableEnumerator.ToDictionary(x => x.Key, x => x.Value); 
     } 

} 


public class User 
{ 

    public string UserID { get; set; }  
    public string Username { get; set; } 
    public string Email { get; set; } 
    public string RoleName { get; set; }  
    public DateTime LastActivityDate { get; set; } 
    public DateTime CreateDate { get; set; } 
    public DateTime LastLoginDate { get; set; } 
    public bool IsActive { get; set; } 
    public bool IsLockedOut { get; set; } 
    public bool IsApproved { get; set; }     

// Other methods to follow.. 
} 



     IEnumerable<KeyValuePair<string,User>> ieUsers = membershipUsers.AsEnumerable().Select(row => 
      { 
       return new KeyValuePair<string,User>(row.UserName.ToString(), 
        new User 
        { 
         Username = row.UserName.ToString(), 
         Email = row.Email.ToString() 
        }); 
      }); 
     allMembershipUsers = ieUsers.ToDictionary(x => x.Key, x => x.Value); 
     return allMembershipUsers; 
    } 
} 
Cuestiones relacionadas