2010-04-14 5 views
140

J'ai une méthode qui retourne un IEnumerable<KeyValuePair<string, ArrayList>>, mais certains des appelants exigent que le résultat de la méthode soit un dictionnaire. Comment puis-je convertir le IEnumerable<KeyValuePair<string, ArrayList>> en Dictionary<string, ArrayList> afin que je puisse utiliser TryGetValue?Recréer un dictionnaire à partir d'un IEnumerable <KeyValuePair <>>

méthode

:

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

appelant:

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

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

Répondre

263

Si vous utilisez .NET 3.5 ou .NET 4, il est facile de créer le dictionnaire LINQ:

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

Il n'y a pas de IEnumerable<T1, T2> mais un KeyValuePair<TKey, TValue> va bien.

+9

Vous penseriez qu'il y aurait un appel qui ne nécessite pas d'arguments, étant donné que Dictionary < TKey, TValue> implémente IEnumerable >, mais bon. Assez facile à faire votre propre. – Casey

+1

@emodendroket pourquoi penseriez-vous cela? Vous pouvez convertir le dictionnaire directement en IEnumerable en raison de l'interface, mais pas l'inverse. c'est-à-dire 'IEnumerable >' n'implémente pas ou hérite de 'Dictionary '. – djv

+4

@DanVerdolino Je le sais. Vous penseriez que parce que c'est comme l'une des choses les plus courantes que vous pourriez vouloir faire avec un IEnumerable de KVPs. – Casey

-27

Création d'un objet Dictionnaire de Datable utilisant 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; 
    } 
} 
Questions connexes