我有以下函数,用于搜索类的属性值以查找文本匹配,如果其中任何一个匹配,则返回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;
}
- 对第二个索引参数使用select,并将其存储在匿名类型。
- 则跳过中指定的号码"start_index"。
- 然后搜索剩余的,如果找到一个,返回原索引