我有ListItemCollection
。每个元素都是ListItem
类型。我想只返回带有值的项目的文本。
目前,我正在使用此功能:
public string GetTextFromPaymentWayCollection(string value)
{
ListItemCollection listPaymentWays = DB.GetList();
foreach (ListItem item in listPaymentWays)
{
if (item.Value == value)
{
return item.Text;
}
}
return null;
}
有没有办法用LINQ做这个,而不是使用这个函数?
答案 0 :(得分:11)
listPaymentWays
ListItemCollection
FirstOrDefault
未实现IEnumerable<T>
。 linq方法是IEnumerable<T>
上的扩展方法。
public static TSource FirstOrDefault<TSource>( this IEnumerable<TSource> source )
您应该首先Cast
(将返回IEnumerble<ListItem>
),然后使用FirstOrDefault
:
var result = listPaymentWays.Cast<ListItem>()
.FirstOrDefault(x => x.Value == value)?.Text;
?.
是C#6.0 Null Proparation功能。
此外,我建议DB.GetList()
将公开一个获取值的方法,以便在数据库中而不是在内存中进行过滤。将所有数据创建为ListItems
然后只需要一个项目就是一种浪费。
答案 1 :(得分:2)
您需要先将其投射以使用Where
。其余的只是普通的Linq。
string s = listPaymentWays.Cast<ListItem>()
.ToDictionary(i => i.Value, i => i.Text)
.Where(x => x.Value == value)
.FirstOrDefault().Value;
答案 2 :(得分:1)
return listPaymentWays.FirstOrDefault(x => x.Value == value)?.Text;
应该可以正常工作。
答案 3 :(得分:0)
旧问题,但您可以使用已经可用的(自.NET 1.1起)非LINQ方法FindByValue
:
return listPaymentWays.Items.FindByValue(value)?.Text;