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来实现这一点,而不是使用这个函数?

ListItemCollection-使用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;