在字符串数组中查找下一个匹配的索引和值

时间:2017-11-08 07:23:55

标签: c# algorithm

我一直在寻找很长一段时间,找到比我更聪明的解决方案,来收集我的数组中项目的索引和值。我不能直接搜索该项目,因为字符串中总会有一些其他字符。 这是我想要做的一个例子。

// logcontent = ["f", "red", "frs", "xyr", "frefff", "xdd", "to"]
string lineData = "";
int lineIndex = 0;
foreach (var item in logContent.Select((value, index) => new { index, value }))
{
    string line = item.value;
    var index = item.index;

    if (line.Contains("x"))
    {
        lineData = line;
        lineIndex = index; 
        break;
    }
}

我想只获得下一个项目

lineData = "xyr";
lineIndex = 3;

4 个答案:

答案 0 :(得分:2)

使用linq的FirstOrDefault

var result = logContent.Select((value, index) => new { index, value })
                       .FirstOrDefault(item => item.value.Contains("x"));

如果没有此类项目,您将获得null

如果使用C#7.0,您可以使用named tuples

(int lineIndex, string lineData) = logcontent.Select((value, index) => (index, value))
                                             .FirstOrDefault(item => item.value.Contains("x"));

然后直接使用lineIndexlineData,就像您使用原始版本一样

答案 1 :(得分:1)

如果我理解问题是正确的,你想在字符串数组中包含下一个包含“x”的字符串。

 var result = logContent.Select((value, index) => new { index, value })
                        .First(x => x.value.Contains("x");

答案 2 :(得分:1)

以下是使用Array.FindIndex的另一种方法 - 其效果优于Linq版本

string[] logContent = { "f", "red", "frs", "xyr", "frefff", "xdd", "to" };  

int lineIndex  = Array.FindIndex(logContent, x => x.Contains("x"));
string lineData = lineIndex >= 0 ? logContent[lineIndex] : null;

答案 3 :(得分:0)

此代码

mouseup

结果

string[] ogcontent = {"f", "red", "frs", "xyr", "frefff", "xdd", "to"};
    string lineData = "";
    int lineIndex = 0;
    for (int i = 0; i < ogcontent.Length; i++)
    {
        string line = ogcontent[i];
        var index = i;

        if (line.Contains("x"))
        {
            lineData = line;
            lineIndex = index; 
            Console.WriteLine("index = {0}", i);
            Console.WriteLine("value = {0}", line);
            break;
        }
    }

工作sample