ListItemCollection - 使用LINQ从值获取文本

Fre*_*kyB 5 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;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法用LINQ做这个,而不是使用这个功能?

Gil*_*een 12

你的意思listPaymentWaysListItemCollection没有实现IEnumerable<T>.linq方法是扩展方法IEnumerable<T>.

例如FirstOrDefault:签名:

public static TSource FirstOrDefault<TSource>(
    this IEnumerable<TSource> source
)
Run Code Online (Sandbox Code Playgroud)

你应该做的是先Cast(将返回一个IEnumerble<ListItem>),然后使用FirstOrDefault:

var result = listPaymentWays.Cast<ListItem>()
                            .FirstOrDefault(x => x.Value == value)?.Text;
Run Code Online (Sandbox Code Playgroud)

?.是C#6.0 Null Proparation功能.


此外,我建议DB.GetList()将公开一个获取值的方法,以便过滤将在数据库中而不是在内存中进行.带来所有数据,创建ListItems它然后只需要一个项目是一种浪费.


VDW*_*WWD 6

您需要先投射它才能使用Where。剩下的就是普通的Linq。

string s = listPaymentWays.Cast<ListItem>()
                          .ToDictionary(i => i.Value, i => i.Text)
                          .Where(x => x.Value == value)
                          .FirstOrDefault().Value;
Run Code Online (Sandbox Code Playgroud)

  • 为什么转换为字典然后执行“Where”?不需要 :) (2认同)