LINQ indexOf特定条目
我有一个MVC3 C#.Net网络应用程序。我有下面的字符串数组。LINQ indexOf特定条目
public static string[] HeaderNamesWbs = new[]
{
WBS_NUMBER,
BOE_TITLE,
SOW_DESCRIPTION,
HARRIS_WIN_THEME,
COST_BOGEY
};
我想在另一个循环中找到给定条目的索引。我认为这份名单会有一个IndexOf。我找不到它。有任何想法吗?
那么你可以使用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 ...谢谢!好东西。我喜欢ReadOnlyCollection想法...赞赏它 – MikeTWebb 2012-02-15 21:22:35
@ jon-skeet使默认的'-1'变得更有意义吗? (pair => pair.index).FirstOrDefault(-1);'选择((value,index)=> new {value,index})。 – 2016-02-09 09:40:14
@lund。mikkel:没有重载'FirstOrDefault',它需要一个默认值来提供(例如,与'DefaultIfEmpty'不同)。 – 2016-02-09 09:43:18
右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);
我迟到了。但我想分享我的解决方案。 Jon's很棒,但我更喜欢简单的lambda表达式。
你可以扩展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.FindIndex(谓词匹配)。
请参阅https://msdn.microsoft.com/en-us/library/x1xzf2ca%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
LINQ对没有索引运算符的集合进行操作。没有'IndexOf' – cadrell0 2012-02-15 19:49:23
@ cadrell0:你可以很容易地构建一个 - 请参阅我的答案。有各种提供索引的LINQ操作符。 – 2012-02-15 19:53:17