ListItemCollection-使用LINQ从值中获取文本
本文关键字:获取 取文本 使用 LINQ ListItemCollection- | 更新日期: 2023-09-27 18:16:25
我有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来实现这一点,而不是使用这个函数?
您的listPaymentWays
属于不实现IEnumerable<T>
的ListItemCollection
。linq方法是IEnumerable<T>
上的扩展方法。
例如FirstOrDefault
:的签名
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
,然后只拿走一个项目,这是一种浪费
要使用Where
,需要先进行强制转换。剩下的只是普通的林克。
string s = listPaymentWays.Cast<ListItem>()
.ToDictionary(i => i.Value, i => i.Text)
.Where(x => x.Value == value)
.FirstOrDefault().Value;
return listPaymentWays.FirstOrDefault(x => x.Value == value)?.Text;
应该可以正常工作。
老问题,但您可以使用已经可用的(自.NET 1.1以来(非LINQ方法FindByValue
:
return listPaymentWays.Items.FindByValue(value)?.Text;