2010-04-14 64 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

可能重复Dictionary对象? http://stackoverflow.com/questions/7850334/how-to-convert-ienumerable-of-keyvaluepairx-y-to-dictionary – Coolkau 2016-10-18 10:13:38

回答

263

如果您使用.NET 3.5或.NET 4,很容易使用LINQ to创建字典:

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 2014-04-08 21:00:04

+1

@emodendroket你为什么这么想?您可以直接将字典强制转换为因接口而提到的IEnumerable,但不能以其他方式。即IEnumerable >'不实现或继承'Dictionary '。 – djv 2014-07-01 15:40:14

+4

@DanVerdolino我知道。你会认为这是因为它就像你可能想用IEnumerable KVPs做的最常见的事情之一。 – Casey 2014-07-01 15:42:18

-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; 
    } 
} 
相关问题