在字符串数组中使用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之前。。。这并不能解决你描述的任何问题,让我们看看你这里的逻辑。
- 我们用"模式"分割字符串。如何
- 然后我们创建一个新的代码列表。如何
- 然后我们循环浏览这些代码并对其进行解码。如何
- 但是,由于我们忘记了跟踪这些代码的来源,我们现在循环使用equationList(它是一个数组,而不是
List<T>
)来替换结果
我觉得有点费解。
也许一个更简单的解决方案是:
- 输入一个
string
,并返回单词的IEnumerable<string>
(类似于您现在所做的操作) - 取一个单词的
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
。