有没有办法从Linq的部分前缀列表中找到索引,如:
List<string> PartialValues = getContentsOfPartialList();
string wholeValue = "-moz-linear-gradient(top, #1e5799 0%, #7db9e8 100%)";
int indexOfPartial = PartialValues
.IndexOf(partialPrefix=>wholeValue.StartsWith(partialPrefix));
不幸的是,IndexOf()
不接受lambda表达式。是否有类似的Linq方法呢?
答案 0 :(得分:25)
您根本不需要LINQ,List<T>
有方法FindIndex
。
int indexOfPartial = PartialValues
.FindIndex(partialPrefix => wholeValue.StartsWith(partialPrefix));
为了完整起见,您可以使用LINQ,但这不是必需的:
int indexOfPartial = PartialValues
.Select((partialPrefix , index) => new{ partialPrefix , index })
.Where(x => wholeValue.StartsWith(x.partialPrefix))
.Select(x => x.index)
.DefaultIfEmpty(-1)
.First();
答案 1 :(得分:3)
蒂姆有最正确的答案(https://stackoverflow.com/a/19792531/467172),但是如果你真的想要IEnumerable<T>
的扩展方法,那么你可以用这样的东西来做:
public static int IndexOf<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
int index = 0;
foreach (var item in source)
{
if (predicate(item)) return index;
index++;
}
return -1;
}
答案 2 :(得分:1)
如果您有List<T>
,请参阅accepted answer。
如果你有IEnumerable
(或其他实现它的集合)而不是List
,你可以使用以下LINQ代码:
int index = PartialValues.TakeWhile(partialPrefix=> ! wholeValue.StartsWith(partialPrefix)).Count();
注意lambda表达式中的否定运算符(!):对于与你的条件不匹配的元素,lambda表达式应返回true
。
如果没有符合条件的元素,代码将返回元素数(例如,索引将指向最后一个元素后面的位置)。
答案 3 :(得分:-1)
您可以使用Enumerable.First
string partialStr = PartialValues.FirstOrDefault(partialPrefix=>wholeValue.StartsWith(partialPrefix);
int partialIndex = PartialValues.IndexOf(partialStr);