如何修改lambda语句以从列表的索引位置开始并返回该位置



我有以下函数,用于搜索类的属性值以查找文本匹配,如果其中任何一个匹配,则返回true。

private static List<Func<Type, string>> _properties;
private static Type _itemType;
public static bool Match(string searchTerm)
{
    bool match = _properties.Select(prop => prop(_itemType)).Any(value => value != null && value.ToLower().Contains(searchTerm.ToLower()));
    return match;
}

_properties列表按照DataGrid列上绑定属性的顺序排列。_itemType为类类型。

我想做的是,继续搜索文本,但是,除此之外,改变这一点,使它将从列表中的特定属性的索引开始,并返回,它到达的第一个属性匹配的索引或null。

函数的开始部分如下所示:

public static int Match(int start_index, string searchTerm)

我需要一些帮助来找出最好的方法来完成这个任务。

如果你想在一个精确的偏移量开始,使用.Skip(int)函数,例如

return _properties.Skip(start_index).Sele[...]

如果你想返回第一个元素的索引,使用.IndexOf()而不是.Any()

由于.IndexOf()在没有结果时返回-1,如果您希望返回null,则可以通过检查返回的值是否等于-1来实现:

if (result == -1)
    return null;

请注意,您必须使返回值为可空int (= int?),以便它能够返回null。

编辑

对不起,IEnumerable s没有IndexOf()函数,因为其中没有索引。您可以尝试使用.TakeWhile(bool).Count()来获取索引。另一种选择是使用.ToList().IndexOf(),如果您真的想使用它,但它会慢得多,因为您必须解析整个对象。

这是你想要的吗?

 public static int? Match(int start_index, string searchTerm)
    {
        var wanted = _properties
            .Select((prop,i) => new { Index = i, Item = prop(_itemType) })
            .Skip(start_index)
            .FirstOrDefault(value => value.Item != null && value.Item.ToLower().Contains(searchTerm.ToLower()));
        return wanted==null ? null : (int?)wanted.Index;
    }
  1. 对第二个索引参数使用select,并将其存储在匿名类型。
  2. 则跳过中指定的号码"start_index"。
  3. 然后搜索剩余的,如果找到一个,返回原索引

相关内容

  • 没有找到相关文章

最新更新