我有一个MVC3 C#.NET Web应用程序。我有以下字符串数组。

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

我想在另一个循环中找到给定条目的索引。我认为列表将有一个索引。我找不到。有任何想法吗?

有帮助吗?

解决方案

好吧,你可以使用 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。)

其他提示

我到这里的线程迟到了。但是我想分享我的解决方案。乔恩(Jon's)很棒,但我更喜欢所有事情。

您可以扩展LINQ本身以获取所需的东西。这很简单。这将允许您使用语法,例如:

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

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

另外,请注意,这仅返回第一个索引。如果您想要索引(复数),则应退还 IEnumerable<int>yeild 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 具有索引(),只是将其声明为 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: 列表(t).indexof方法(t)

如果要使用函数搜索列表而不是指定项目值,则可以使用list.findindex(谓词匹配)。

https://msdn.microsoft.com/en-us/library/x1xzf2ca%28v=vs.110%29.aspx?f=255&mspperror = 2147217396

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top