如何向IList添加“查找”功能

5

我从业务层返回IList。但在视图模型中,我必须使用Find函数。一种方法是将IList转换为List。

但是否有办法向IList添加“查找”方法?


只需创建自己的 IFindableList:IList 实现,其中包括查找功能。由于您控制自己的 BL 代码,因此可以返回此 FindableList。 - cordialgerm
5个回答

8

嗯,有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);
    }
}

如果我将这个文件添加到我的.cs项目中,我能够访问IListVar.FindFirst()吗? - Relativity
是的,只要 IListExtensions 在作用域内,您就可以针对任何 IList<T> 调用 FindFirst 方法。 - scmccart
ToList()方法在Linq中是什么?我可以使用它吗? - Relativity
ToList会将IEnumerable<T>转换成List<T>。 - scmccart

2
您可以使用 Where 方法。
list.Where(predicate).First()

2
list.First(predicate) 的性能比 list.Where(predicate).First() 好,因为后者会枚举整个列表以查找多个匹配项。 - Gabriel
如果未找到项,则 First() 将引发异常,您希望 FirstOrDefault() 具有与 Find() 相同的行为。 - Slate

2

如果您正在使用 .net 3.5 或 5,您可以使用 .Select 并获取 IList 中满足条件的所有元素 http://msdn.microsoft.com/en-us/library/bb548891.aspx - John Boker
有没有办法将这些函数添加到IList中? - Relativity
我认为因为IList是IEnumerable,它已经有了这些扩展方法,请查看http://msdn.microsoft.com/en-us/library/5y536ey6.aspx。 - John Boker
虽然这是一个IList<T>,但你可能需要将其转换为你特定的类型。 - John Boker

0

非常简单,你只需要

转换步骤

var myModelasList= IListReturnedViewModel as List<ViewModelObject>;
//now you can use list feaures like Find Func.
myModelasList.Find((t => t.SomeFiald== currentState && t.IsSomting == somesymbol);

0
我编写了一个扩展方法来为我执行强制转换。
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));
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接