📜  c# 查找所有索引 - C# (1)

📅  最后修改于: 2023-12-03 14:39:47.124000             🧑  作者: Mango

C# 查找所有索引

当我们需要查找集合或数组中某个元素的位置时,可以使用C#内置的ListArray类提供的IndexOf方法。但是这种方法只会返回第一个匹配项的索引位置,如果集合或数组中有多个相同的元素,就需要使用ListArray类提供的其他方法或者自定义方法来查找所有相同元素的位置。

下面介绍几种查找所有索引的方法。

方法一:使用List的FindAll方法

ListFindAll方法可以返回一个与指定谓词相匹配的所有元素列表。我们可以自定义谓词来实现查找所有相同元素的位置。

List<int> nums = new List<int> { 1, 2, 3, 4, 5, 4, 3, 2, 1 };
int findNum = 4;

List<int> indexes = nums.Select((num, index) => new { num, index })
                        .Where(x => x.num == findNum)
                        .Select(x => x.index)
                        .ToList();

上述代码中,我们先将List<int>转为包含元素和索引的匿名对象列表,然后使用Where方法查找所有等于findNum的元素对象,最后使用Select方法取出所有元素对象的索引值并转为List返回。

方法二:使用List的FindIndex方法结合while循环

ListFindIndex方法可以返回与指定谓词相匹配的第一个元素索引,我们可以结合while循环不断查找剩余元素的索引直到找不到为止。

List<int> nums = new List<int> { 1, 2, 3, 4, 5, 4, 3, 2, 1 };
int findNum = 4;

List<int> indexes = new List<int>();
int index = nums.FindIndex(num => num == findNum);

while (index != -1)
{
    indexes.Add(index);
    index = nums.FindIndex(index + 1, num => num == findNum);
}

上述代码中,我们先使用FindIndex方法查找第一个等于findNum的元素索引,并将其添加到索引列表中;然后不断使用FindIndex方法查找剩余元素的索引,直到找不到为止。

方法三:使用Array的FindAll方法

ArrayFindAll方法可以返回一个与指定谓词相匹配的所有元素数组。我们可以自定义谓词来实现查找所有相同元素的位置。

int[] nums = new int[] { 1, 2, 3, 4, 5, 4, 3, 2, 1 };
int findNum = 4;

int[] indexes = Array.FindAll(nums, num => num == findNum);

上述代码中,我们直接使用Array类的FindAll方法查找所有等于findNum的元素,并返回一个整数数组。

以上就是查找所有索引的几种常用方法。需要注意的是,在查找所有索引时,我们需要使用List或者Array类提供的方法,而不能直接使用IndexOf方法。