获取字符串数组中匹配元素的所有索引

时间:2017-05-03 08:47:16

标签: c# arrays linq

我有这个字符串数组:

string[] stringArray = { "fg v1", "ws v2", "sw v3", "sfd v2"  };
string value = "v2";

如何获取数组中所有出现值的所有索引?

所以对于这个例子我们应该得到一个int = [1,3]的数组  最好没有循环。

4 个答案:

答案 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();

Working example