在一个数组中查找某个值的索引

126

linq是否可以用来在数组中查找值的索引?

例如,下面的循环可以在数组中定位键索引。

for (int i = 0; i < words.Length; i++)
{
    if (words[i].IsKey)
    {
        keyIndex = i;
    }
}
8个回答

204
int keyIndex = Array.FindIndex(words, w => w.IsKey);

无论你创建了什么自定义类,这实际上会给你整数索引而不是对象。


72

对于数组,您可以使用:Array.FindIndex<T>

int keyIndex = Array.FindIndex(words, w => w.IsKey);

对于列表,你可以使用 List<T>.FindIndex 方法:

int keyIndex = words.FindIndex(w => w.IsKey);

你也可以编写一个通用的扩展方法,适用于任何 Enumerable<T>

///<summary>Finds the index of the first item matching an expression in an enumerable.</summary>
///<param name="items">The enumerable to search.</param>
///<param name="predicate">The expression to test the items against.</param>
///<returns>The index of the first matching item, or -1 if no items match.</returns>
public static int FindIndex<T>(this IEnumerable<T> items, Func<T, bool> predicate) {
    if (items == null) throw new ArgumentNullException("items");
    if (predicate == null) throw new ArgumentNullException("predicate");

    int retVal = 0;
    foreach (var item in items) {
        if (predicate(item)) return retVal;
        retVal++;
    }
    return -1;
}

你也可以使用LINQ:

int keyIndex = words
    .Select((v, i) => new {Word = v, Index = i})
    .FirstOrDefault(x => x.Word.IsKey)?.Index ?? -1;

10
int keyIndex = words.TakeWhile(w => !w.IsKey).Count();

3
+1 但是,如果该项不存在怎么办?我们将获得0,但索引是-1。 - Arsen Mkrtchyan
如果该项不存在,则会产生 words.Length。 - Jim Balter
@ArsenMkrtchyan 你写道“我们将得到0”...那是错误的。你写道“但索引是-1”...那也是错误的。-1是失败的常见指标,但它不是唯一可能的指标。任何不在0..words.Length-1范围内的值都可以。 - Jim Balter
1
@JimBalter,我的意思是如果项不存在,则表达式将返回0,这有什么问题吗?我同意-1是常见的指示器,但同意99%的情况下,当项不存在时,-1是预期值。至少当项不存在时,0是错误的。 - Arsen Mkrtchyan

7

如果您想查找单词,可以使用以下方法

var word = words.Where(item => item.IsKey).First();

这将为您提供第一个IsKey为true的项目(如果可能没有,则可以使用.FirstOrDefault()

要获取项目和索引,您可以使用以下方法

KeyValuePair<WordType, int> word = words.Select((item, index) => new KeyValuePair<WordType, int>(item, index)).Where(item => item.Key.IsKey).First();

3

试试这个...

var key = words.Where(x => x.IsKey == true);

2

1

这个解决方案对我帮助更大,来自微软的MSDN

var result =  query.AsEnumerable().Select((x, index) =>
              new { index,x.Id,x.FirstName});

query is your toList() query.


0
int index = -1;
index = words.Any (word => { index++; return word.IsKey; }) ? index : -1;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接