在字符串数组中使用LINQ来提高C#的效率

本文关键字:效率 LINQ 数组 字符串 | 更新日期: 2023-09-27 17:59:29

我有一个等式字符串,当我用我的模式分割它时,我得到下面的字符串数组。

string[] equationList = {"code1","+","code2","-","code3"};

然后我创建了一个只包含代码的列表。

List<string> codeList = {"code1","code2","code3"};

然后现有代码循环通过codeList并检索每个代码的值,并用下面的代码替换equationList中的值。

foreach (var code in codeList ){
 var codeVal = GetCodeValue(code);
  for (var i = 0; i < equationList.Length; i++){
     if (!equationList[i].Equals(code,StringComparison.InvariantCultureIgnoreCase)) continue;
                        equationList[i] = codeVal;
                        break;
     }
}

我正在努力提高效率,我相信我可以通过使用linq来消除foreach中的for循环。

我的问题是,如果我这样做,在加快进程方面会更好吗?

如果是,那么你能帮我做linq的陈述吗?

在字符串数组中使用LINQ来提高C#的效率

在跳转到LINQ之前。。。这并不能解决你描述的任何问题,让我们看看你这里的逻辑。

  1. 我们用"模式"分割字符串。如何
  2. 然后我们创建一个新的代码列表。如何
  3. 然后我们循环浏览这些代码并对其进行解码。如何
  4. 但是,由于我们忘记了跟踪这些代码的来源,我们现在循环使用equationList(它是一个数组,而不是List<T>)来替换结果

我觉得有点费解。

也许一个更简单的解决方案是:

  1. 输入一个string,并返回单词的IEnumerable<string>(类似于您现在所做的操作)
  2. 取一个单词的IEnumerable<string>,并返回一个值的IEnumerable<?>

也就是说,在第二步中,对字符串进行迭代,并简单地返回您想要返回的值,而不是试图提取某些值,解析它们,然后将它们插入回集合中。

//Ideally we return something more specific eg, IEnumerable<Tokens>
public IEnumerable<string> ParseEquation(IEnumerable<string> words)
{
    foreach (var word in words)
    {
        if (IsOperator(word)) yield return ToOperator(word);
        else if (IsCode(word)) yield return ToCode(word);
        else ...;
    }
}

这与LINQ Select语句非常相似。。。如果有人坚持,我会建议写这样的东西:

var tokens = equationList.Select(ToToken);
...
public Token ToToken(string word)
{
    if (IsOperator(word)) return ToOperator(word);
    else if (IsCode(word)) return ToCode(word);
    else ...;
}

如果GetCodeValue(代码)还没有,我建议它可能会在实现中使用某种缓存/字典——尽管具体情况需要说明这一点。

这种方法的好处是它很灵活(我们可以很容易地添加更多的处理步骤),易于遵循(我们输入这些值并因此获得这些值,没有变化的状态),并且易于编写。它还将问题分解为解决自己任务的小块,这将在尝试重构或发现小错误/性能问题时提供极大帮助。

如果您的数组总是交替的codex,那么运算符这个LINQ应该执行您想要的操作:

    string[] equationList = { "code1", "+", "code2", "-", "code3" };
    var processedList = equationList.Select((s,j) => (j % 2 == 1) ? s :GetCodeValue(s)).ToArray();

您需要检查是否更快

我认为最快的解决方案是:

var codeCache = new Dictionary<string, string>();
for (var i = equationList.Length - 1; i >= 0; --i)
{
    var item = equationList[i];
    if (! < item is valid >) // you know this because you created the codeList
        continue;
    string codeVal;
    if (!codeCache.TryGetValue(item, out codeVal))
    {
        codeVal = GetCodeValue(item);
        codeCache.Add(item, codeVal);
    }
    equationList[i] = codeVal;
}

你不需要codeList。如果每个代码都是唯一的,则可以删除codeCace