13

有没有办法使用 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

4 回答 4

34

你根本不需要 LINQ,List<T>有一个方法FindIndex

int indexOfPartial = PartialValues
    .FindIndex(partialPrefix => wholeValue.StartsWith(partialPrefix));

为了完整起见,您可以使用 LINQ,但这不是必需的:

int indexOfPartial = PartialValues
  .Select((partialPrefix , index) => (partialPrefix , index))
  .Where(x => wholeValue.StartsWith(x.partialPrefix))
  .Select(x => x.index)
  .DefaultIfEmpty(-1)
  .First();
于 2013-11-05T15:27:26.627 回答
5

蒂姆有最正确的答案(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;
}
于 2013-11-05T16:12:44.630 回答
4

如果有List<T>,请参阅接受的答案

如果您有IEnumerable(或实现它的其他集合)而不是List,则可以使用以下 LINQ 代码:

int index = PartialValues.TakeWhile(partialPrefix=> ! wholeValue.StartsWith(partialPrefix)).Count();

注意 lambda 表达式中的否定运算符 (!):lambda 表达式应该返回true与您的条件不匹配的元素。

如果没有元素符合条件,代码将返回元素的数量(例如,索引将指向紧随最后一个元素之后的位置)。

于 2014-04-14T12:36:09.287 回答
-1

您可以使用Enumerable.First

string partialStr = PartialValues.FirstOrDefault(partialPrefix=>wholeValue.StartsWith(partialPrefix);
int partialIndex = PartialValues.IndexOf(partialStr);
于 2013-11-05T15:23:44.450 回答