2010-04-14 2 views
140

У меня есть метод, который возвращает IEnumerable<KeyValuePair<string, ArrayList>>, но некоторые из вызывающих пользователей требуют, чтобы этот метод был словарем. Как можно преобразовать IEnumerable<KeyValuePair<string, ArrayList>> в Dictionary<string, ArrayList>, чтобы я мог использовать TryGetValue?Воспроизведение словаря из IEnumerable <KeyValuePair <>>

метод:

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

Вызывающий:

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

Возможного дубликат? http://stackoverflow.com/questions/7850334/how-to-convert-ienumerable-of-keyvaluepairx-y-to-dictionary – Coolkau

ответ

263

Если вы используете .NET 3.5 или .NET 4, это легко создать словарь с помощью LINQ:

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

Нет такой вещи, как IEnumerable<T1, T2>, но KeyValuePair<TKey, TValue> в порядке.

+9

Вы бы подумали, что будет вызов, который не требует аргументов, учитывая, что Dictionary < TKey, TValue> реализует IEnumerable >, но хорошо. Достаточно легко сделать свой собственный. – Casey

+1

@emodendroket Почему вы так думаете? Вы можете использовать словарь непосредственно в IEnumerable, упомянутом из-за интерфейса, но не наоборот. то есть 'IEnumerable >' не реализует и не наследует словарь '. – djv

+4

@DanVerdolino Я знаю это. Вы могли бы подумать, что это похоже на одну из самых распространенных вещей, которые вы можете сделать с IEnumerable из KVP. – Casey

-27

Создание словаря объекта из датируемых с помощью 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; 
    } 
} 
Смежные вопросы