我有下面的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.
}
}
//我将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);
}
如果要通过集合的Customer
检索集合中的Id
名称:
public string GetCustomerName(IEnumerable<Customer> customers, int id)
{
return customers.First(c => c.Id == id).Name;
}
使用LINQ
,您可以通过这种方式获得具有特定ID(键)的所有客户名称(值):
var valuesList = items.Where(x => x.Id == 1).Select(v => v.Name).ToList();
对于单个客户名称,您可以这样做:
var singleName = items.FirstOrDefault(x => x.Id == 1)?.Name;
显然,ID可以是1、2或任何其他。
编辑:
我建议您使用List<Customer>
而不是Customer[]
所以,
var items = new List<Customer>
{
new Customer { Name = "test1", Id = 999 },
new Customer { Name = "test2", Id = 989 }
};
只需使用LINQ即可完成您想做的事情。如果要检索特定值,可以使用where
,如下所示:
public Customer GetCustomerById(IEnumerable<Customer> items,int key)
{
return items.Where(x=>x.id==key)
.Select(x =>x.Name)
.First();
}
这将检索匹配特定ID的客户。
创建列表后,您是否要重复查找内容?如果是这样,您可能要考虑创建字典来进行查找,例如:
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".
我假设您不是一开始就创建集合-如果您可以控制创建原始集合,则可以首先使用字典。