【问题标题】:IndexOf with Linq, accepting lambda expressionIndexOf 与 Linq,接受 lambda 表达式
【发布时间】:2013-11-05 15:20:14
【问题描述】:

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

【问题讨论】:

  • 那么你期望它做什么?您的预期输出是什么?
  • PartialValues 是什么类型
  • @Arran, @SriramSakthivel, 它的 List&lt;string&gt; 具有“-ms-”、“-moz-”、“-o-”等值。

标签: c# linq lambda


【解决方案1】:

你根本不需要 LINQ,List&lt;T&gt; 有一个方法 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();

【讨论】:

  • 太棒了!正是我想要的。谢谢你。 :)
  • Linq 代码似乎不正确。您需要调用.First() 将序列转换为值。请注意,尝试使用.FirstOrDefault() 来避免异常处理会使索引值不明确:当未找到项和在列表头部找到项时,它将保持为 0。
  • @firegurafiku:我刚刚注意到你的评论。固定的。现在它的行为与List.FindIndex 相同。一个很好的例子,LINQ 并不总是更易读/更简洁。
【解决方案2】:

Tim 有最正确的答案 (https://stackoverflow.com/a/19792531/467172),不过如果你真的想要 IEnumerable&lt;T&gt; 的扩展方法,那么你可以这样做:

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;
}

【讨论】:

    【解决方案3】:

    如果您有List&lt;T&gt;,请参阅accepted answer

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

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

    注意 lambda 表达式中的否定运算符 (!):对于不符合条件的元素,lambda 表达式应返回 true

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

    【讨论】:

      【解决方案4】:

      您可以使用Enumerable.First

      string partialStr = PartialValues.FirstOrDefault(partialPrefix=>wholeValue.StartsWith(partialPrefix);
      int partialIndex = PartialValues.IndexOf(partialStr);
      

      【讨论】:

      • 当您只需要这样做一次时,它会迭代序列两次以获得索引。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多