c# - 如何获取 IEnumerable 中元素的索引?

标签 c# .net linq ienumerable indexof

我是这样写的:

public static class EnumerableExtensions
{
    public static int IndexOf<T>(this IEnumerable<T> obj, T value)
    {
        return obj
            .Select((a, i) => (a.Equals(value)) ? i : -1)
            .Max();
    }

    public static int IndexOf<T>(this IEnumerable<T> obj, T value
           , IEqualityComparer<T> comparer)
    {
        return obj
            .Select((a, i) => (comparer.Equals(a, value)) ? i : -1)
            .Max();
    }
}

但我不知道它是否已经存在,是吗?

最佳答案

我会质疑这种智慧,但也许:

source.TakeWhile(x => x != value).Count();

(如果需要,使用 EqualityComparer<T>.Default 来模拟 !=) - 但如果没有找到,您需要注意返回 -1 ......所以也许只是长途跋涉

public static int IndexOf<T>(this IEnumerable<T> source, T value)
{
    int index = 0;
    var comparer = EqualityComparer<T>.Default; // or pass in as a parameter
    foreach (T item in source)
    {
        if (comparer.Equals(item, value)) return index;
        index++;
    }
    return -1;
}

关于c# - 如何获取 IEnumerable 中元素的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1290603/

相关文章:

c# - 变量声明应该总是放在循环之外吗?

c# - 为windows服务添加描述

c# - 动态和其他类型的重载方法

c# - 获取IIS中使用的类项目的执行路径

.net - 您可以使用 .net 创建 Windows 资源管理器插件吗?

c# - Entity Framework : Why DbSet<T> Loads all data

c# - 如何使用反射根据xml文件中的文本实例化一个新类

.net - web.config 忽略 Settings.Default.<Property> 并始终使用默认值

c# - 给定一个成员访问 lambda 表达式,将其转换为具有完整访问路径的特定字符串表示形式

c# - Roslyn 检查属性的类型