我有一个MVC3 C#.Net网络应用程序。我有以下字符串数组。
public static string[] HeaderNamesWbs = new[]
{
WBS_NUMBER,
BOE_TITLE,
SOW_DESCRIPTION,
HARRIS_WIN_THEME,
COST_BOGEY
};
我想在另一个循环中找到给定条目的索引。我以为列表会有一个IndexOf。我找不到它。有什么想法吗?
答案 0 :(得分:44)
您可以使用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是为了“丢失”而不是0,它将返回-1。)
答案 1 :(得分:13)
我这里的帖子迟到了。但我想分享我的解决方案。 Jon很棒,但我更喜欢简单的lambdas。
您可以扩展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;
}
答案 2 :(得分:5)
右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);
答案 3 :(得分:1)
如果要使用函数搜索List而不是指定项值,可以使用List.FindIndex(谓词匹配)。
请参阅https://msdn.microsoft.com/en-us/library/x1xzf2ca%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396