ListItemCollection - 使用LINQ从值获取文本

时间:2016-11-04 15:08:16

标签: c# linq

我有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做这个,而不是使用这个函数?

4 个答案:

答案 0 :(得分:11)

listPaymentWays ListItemCollection FirstOrDefault未实现IEnumerable<T>。 linq方法是IEnumerable<T>上的扩展方法。

例如enter image description here的签名:

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;