【问题标题】:How to add "Find" function to IList如何将“查找”功能添加到 IList
【发布时间】:2011-05-09 17:25:16
【问题描述】:

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

但是有没有办法在 IList 中添加“Find”方法

【问题讨论】:

  • 只需创建您自己的 IFindableList :包含 Find 功能的 IList 实现。由于您控制自己的 BL 代码,因此您可以返回此 FindableList

标签: c# list find ilist


【解决方案1】:

嗯,有 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() 吗?
  • 是的,只要 IListExtensions 在范围内,您就可以针对任何 IList 调用 FindFirst 方法。
  • 什么是 Linq 中的 ToList() 方法?..我可以使用这个
  • ToList 会将一个 IEnumerable 变成一个 List
【解决方案2】:

你可以使用 IndexOf 方法吗?

http://msdn.microsoft.com/en-us/library/3w0148af.aspx

【讨论】:

【解决方案3】:

你可以使用 Where 方法

list.Where(predicate).First()

【讨论】:

  • list.First(predicate) 将比 list.Where(predicate).First() 执行得更好,因为第二个将枚举所有列表以查找不止一次出现
  • First() 如果未找到项目将引发异常,您希望 FirstOrDefault() 与 Find() 具有相同的行为
【解决方案4】:

很简单,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);

【讨论】:

    【解决方案5】:

    我写了一个扩展方法来为我做转换。

    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));
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 2015-10-30
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多