我有这个字符串数组:
string[] stringArray = { "fg v1", "ws v2", "sw v3", "sfd v2" };
string value = "v2";
如何获取数组中所有出现值的所有索引?
所以对于这个例子我们应该得到一个int = [1,3]
的数组
最好没有循环。
答案 0 :(得分:4)
您可以使用LINQ Where
扩展方法进行过滤,并使用Select
来获取索引:
int[] indexesMatched = stringArray.Select((value, index) => new { Value = value, Index = index }
.Where(x => x.Value.Contains("v2"))
.Select(x => x.Index)
.ToArray();
答案 1 :(得分:4)
没错。 Array
-class中的Enumerable
-class或扩展方法中没有方法返回给定谓词的所有索引。所以这是一个:
public static IEnumerable<int> FindIndexes<T>(this IEnumerable<T> items, Func<T, bool> predicate)
{
int index = 0;
foreach (T item in items)
{
if (predicate(item))
{
yield return index;
}
index++;
}
}
以下是您的样本:
string[] stringArray = { "fg v1", "ws v2", "sw v3", "sfd v2" };
string value = "v2";
int[] allIndexes = stringArray.FindIndexes(s => s.Contains(value)).ToArray();
它使用延迟执行,因此如果您不需要,则不需要使用所有索引。
答案 2 :(得分:2)
Linq方法
string[] stringArray = { "fg v1", "ws v2", "sw v3", "sfd v2" };
string value = "v2";
int[] result = stringArray.Select((x, i) => x.Contains(value) ? i : -1)
.Where(x => x != -1)
.ToArray();
答案 3 :(得分:1)
选择后跟Where:
的结果相同var indexes = stringArray.Select((x,i) => x.Contains(searchStr)? i.ToString() : "")
.Where(x=> x!="" ).ToList();