如何使用其密钥从IEnumerable集合中获取价值?

时间:2015-08-24 07:07:56

标签: c# ienumerable ienumerator

我有IEnumerable集合,如下面的

IEnumerable<Customer> items = new Customer[] 
{ 
     new Customer { Name = "test1", Id = 999 }, 
     new Customer { Name = "test2", Id = 989 } 
};

我希望使用键Id

获取价值

我试过跟随

public int GetValue(IEnumerable<T> items,string propertyName)
{
      for (int i = 0; i < items.Count(); i++)
      {
           (typeof(T).GetType().GetProperty(propertyName).GetValue(typeof(T), null));
           // I will pass propertyName as Id and want all Id propperty values 
           // from items collection one by one.
      }
}

5 个答案:

答案 0 :(得分:9)

  

//我会将propertyName作为Id传递,并希望所有Id属性值

     

//逐项收集物品。

如果我理解正确

public static IEnumerable<object> GetValues<T>(IEnumerable<T> items, string propertyName)
{
    Type type = typeof(T);
    var prop = type.GetProperty(propertyName);
    foreach (var item in items)
        yield return prop.GetValue(item, null);
}

答案 1 :(得分:8)

如果您想通过Customer从集合中检索Id名称:

public string GetCustomerName(IEnumerable<Customer> customers, int id)
{
    return customers.First(c => c.Id == id).Name;
}

答案 2 :(得分:5)

使用LINQ,您可以通过这种方式获得具有特定ID(密钥)的所有客户名称(值):

var valuesList = items.Where(x => x.Id == 1).Select(v => v.Name).ToList();

对于单个客户名称,您可以执行以下操作:

var singleName = items.Where(x => x.Id == 1).FirstOrDefault(v => v.Name);

显然,Id可以是1,2或任何其他。

编辑:

我建议您List<Customer>代替Customer[]

所以,

var items = new List<Customer> 
{ 
     new Customer { Name = "test1", Id = 999 }, 
     new Customer { Name = "test2", Id = 989 } 
};

答案 3 :(得分:4)

只需使用LINQ即可实现您的目标。如果您想要检索特定值,可以使用where,如下所示:

public Customer GetCustomerById(IEnumerable<Customer> items,int key)
{
    return items.Where(x=>x.id==key)
   .Select(x =>x.Name)
   .First(); 
}

这将检索与特定ID匹配的客户。

答案 4 :(得分:0)

创建列表后,您是否想重复查看?如果是这样,您可能需要考虑创建一个字典来执行查找,如下所示:

IEnumerable<Customer> items = new Customer[]
{
    new Customer {Name = "test1", Id = 999},
    new Customer {Name = "test2", Id = 989}
};

var lookup = items.ToDictionary(itemKeySelector => itemKeySelector.Id);

var result = lookup[989];

Console.WriteLine(result.Name); // Prints "test2".

我假设您不首先创建集合 - 如果您可以控制创建原始集合,则可以首先使用字典。