📅  最后修改于: 2023-12-03 14:39:47.124000             🧑  作者: Mango
当我们需要查找集合或数组中某个元素的位置时,可以使用C#内置的List
和Array
类提供的IndexOf
方法。但是这种方法只会返回第一个匹配项的索引位置,如果集合或数组中有多个相同的元素,就需要使用List
和Array
类提供的其他方法或者自定义方法来查找所有相同元素的位置。
下面介绍几种查找所有索引的方法。
List
的FindAll
方法可以返回一个与指定谓词相匹配的所有元素列表。我们可以自定义谓词来实现查找所有相同元素的位置。
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循环不断查找剩余元素的索引直到找不到为止。
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
方法可以返回一个与指定谓词相匹配的所有元素数组。我们可以自定义谓词来实现查找所有相同元素的位置。
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方法。