【发布时间】:2011-05-09 17:25:16
【问题描述】:
我正在从业务层返回 IList。但在视图模型中我必须使用 Find 功能。 一种方法是将 IList 转换为 List。
但是有没有办法在 IList 中添加“Find”方法
【问题讨论】:
-
只需创建您自己的 IFindableList :包含 Find 功能的 IList 实现。由于您控制自己的 BL 代码,因此您可以返回此 FindableList
我正在从业务层返回 IList。但在视图模型中我必须使用 Find 功能。 一种方法是将 IList 转换为 List。
但是有没有办法在 IList 中添加“Find”方法
【问题讨论】:
嗯,有 Linq 扩展方法 .Where(用于匹配所有匹配项)和 .FirstOrDefault(用于获取第一个匹配项),或者您可以针对 IList 编写自己的扩展方法,例如:
public static class IListExtensions
{
public static T FindFirst<T>(this IList<T> source, Func<T, bool> condition)
{
foreach(T item in source)
if(condition(item))
return item;
return default(T);
}
}
【讨论】:
你可以使用 IndexOf 方法吗?
【讨论】:
你可以使用 Where 方法
list.Where(predicate).First()
【讨论】:
很简单,just you need
铸造步骤
var myModelasList= IListReturnedViewModel as List<ViewModelObject>;
//now you can use list feaures like Find Func.
myModelasList.Find((t => t.SomeFiald== currentState && t.IsSomting == somesymbol);
【讨论】:
我写了一个扩展方法来为我做转换。
public static T Find<T>(this IList<T> ilist, Predicate<T> match)
{
if (ilist is List<T> list)
{
return list.Find(match);
}
else if (ilist is T[] array)
{
return Array.Find(array, match);
}
else
{
return ilist.FirstOrDefault(i => match(i));
}
}
【讨论】: