特定条目的LINQ索引

本文关键字:LINQ 索引 | 更新日期: 2023-09-27 18:24:39

我有一个MVC3 C#.Net web应用程序。我有下面的字符串数组。

    public static string[] HeaderNamesWbs = new[]
                                       {
                                          WBS_NUMBER,
                                          BOE_TITLE,
                                          SOW_DESCRIPTION,
                                          HARRIS_WIN_THEME,
                                          COST_BOGEY
                                       };

我想在另一个循环中查找给定条目的索引。我以为这个列表会有IndexOf。我找不到了。有什么想法吗?

特定条目的LINQ索引

您可以使用Array.IndexOf:

int index = Array.IndexOf(HeaderNamesWbs, someValue);

或者只需将HeaderNamesWbs声明为IList<string>——如果您需要,它仍然可以是一个数组:

public static IList<string> HeaderNamesWbs = new[] { ... };

请注意,我建议您不要将数组公开为public static,甚至是public static readonly。您应该考虑ReadOnlyCollection:

public static readonly ReadOnlyCollection<string> HeaderNamesWbs =
    new List<string> { ... }.AsReadOnly();

如果你想要IEnumerable<T>,你可以使用:

var indexOf = collection.Select((value, index) => new { value, index })
                        .Where(pair => pair.value == targetValue)
                        .Select(pair => pair.index + 1)
                        .FirstOrDefault() - 1;

(+1和-1是这样,它将返回-1表示"丢失",而不是0。)

我来晚了。但我想分享我的解决方案。乔恩的很棒,但我更喜欢简单的羊羔肉。

您可以扩展LINQ本身以获得您想要的内容。这相当简单。这将允许您使用以下语法:

// Gets the index of the customer with the Id of 16.
var index = Customers.IndexOf(cust => cust.Id == 16);

默认情况下,这可能不是LINQ的一部分,因为它需要枚举。它不仅仅是另一个延迟的选择器/谓词。

另外,请注意,这只返回第一个索引。如果想要索引(复数),则应该在方法中返回一个IEnumerable<int>yield return index。当然不要返回-1。如果您不使用主键进行筛选,这将非常有用。

  public static int IndexOf<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
     
     var index = 0;
     foreach (var item in source) {
        if (predicate.Invoke(item)) {
           return index;
        }
        index++;
     }
     return -1;
  }

如果要使用函数搜索List而不是指定项值,可以使用List.FindIndex(谓词匹配)。

请参阅https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.findindex?view=netframework-4.8

Right List有IndexOf(),只需将其声明为ILIst<string>而不是string[]

public static IList<string> HeaderNamesWbs = new List<string>
                                   {
                                      WBS_NUMBER,
                                      BOE_TITLE,
                                      SOW_DESCRIPTION,
                                      HARRIS_WIN_THEME,
                                      COST_BOGEY
                                   };
int index = HeaderNamesWbs.IndexOf(WBS_NUMBER);

MSDN:List(Of T).IndexOf Method(T)