首页 / .NET / 正文

[LINQ].NET/C#程序开发在IEnumerable<T>的集合中查找某个元素的索引位置?

6852 发布于: 2018-03-19 读完约需7分钟

问题描述

.NET/C#程序开发中,比如当前有一个IEnumerable<T>的集合(注意:不是List<T>),现需要在这个IEnumerable<T>中查找某个指定元素的索引位置,应该如何实现呢?

方案一

使用EqualityComparer<T>.Default作为比较器来实现查询IEnumerable<T>的某个元素索引位置的需求,创建一个静态扩展方法 如下:

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

方案二

另一种基于EqualityComparer<T>.Default的静态扩展方法实现,如下:

public static class EnumerableExtensions
{
    public static int IndexOf<T>(this IEnumerable<T> obj, T value)
    {
        return obj.IndexOf(value, null);
    }

    public static int IndexOf<T>(this IEnumerable<T> obj, T value, IEqualityComparer<T> comparer)
    {
        comparer = comparer ?? EqualityComparer<T>.Default;
        var found = obj
            .Select((a, i) => new { a, i })
            .FirstOrDefault(x => comparer.Equals(x.a, value));
        return found == null ? -1 : found.i;
    }
}

方案三

public static int IndexOf<T>(this IEnumerable<T> source, Func<T, bool> predicate)
 {
     int retval = -1;
     var enumerator = source.GetEnumerator();

     while (enumerator.MoveNext())
     {
         retval += 1;
         if (predicate(enumerator.Current))
         {
             IDisposable disposable = enumerator as System.IDisposable;
             if (disposable != null) disposable.Dispose();
             return retval;
         }
     }
     IDisposable disposable = enumerator as System.IDisposable;
     if (disposable != null) disposable.Dispose();
     return -1;
 }

方案四

public static int IndexOf<T>(this IEnumerable<T> list, T item)
{
    return list.Select((x, index) => EqualityComparer<T>.Default.Equals(item, x)
                                     ? index
                                     : -1)
               .FirstOr(x => x != -1, -1);
}

或者查找某个元素出现的第一次的索引位置,如下:

public static T FirstOr<T>(this IEnumerable<T> source, T alternate)
{
    return source.DefaultIfEmpty(alternate)
                 .First();
}

public static T FirstOr<T>(this IEnumerable<T> source, Func<T, bool> predicate, T alternate)
{
    return source.Where(predicate)
                 .FirstOr(alternate);
}

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: [C#].NET/C#程序开发中将一个字符数组char[]连接成字符串的方法有哪些呢?

下一篇: [LINQ].NET/C#应用程序中使用LINQ分组排序后获取每组第一条记录的实现方法有哪些?

本文永久链接码友网 » [LINQ].NET/C#程序开发在IEnumerable<T>的集合中查找某个元素的索引位置?

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册