与Linq一起使用IndexOf,接受lambda表达式

时间:2013-11-05 15:20:15

标签: c# linq lambda

有没有办法从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方法呢?

4 个答案:

答案 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);