我有下面的代码,它的目的是为了我需要的目的,但我知道它可以更快。如果能以任何方式改进此代码,请告诉我......
主要问题是我需要多次查询“数据”。我只需要确保没有我可以使用的捷径。
data= GetData()// this return ILookup<Tuple(string, string, string),string>
foreach (var v0 in data)
{
if (v0.Key.Item3 == string.Empty)
{
//Get all related data
var tr_line = data[v0.Key];
sb.AppendLine(tr_line.First());
foreach (var v1 in data)
{
if (v1.Key.Item2 == string.Empty && v1.Key.Item1 == v0.Key.Item1)
{
var hh_line = data[v1.Key];
sb.AppendLine(hh_line.First());
foreach (var v2 in data)
{
if (v2.Key.Item1 == v0.Key.Item1 && v2.Key.Item2 != string.Empty && v2.Key.Item3 != string.Empty)
{
var hl_sl_lines = data[v2.Key].OrderByDescending(r => r);
foreach (var v3 in hl_sl_lines)
{
sb.AppendLine(v3);
}
}
}
}
}
}
}
答案 0 :(得分:1)
首先,尽量避免使用Tuple来处理这种代码,因为即使对你而言,几个月后,这段代码也难以理解。使用正确的属性名创建一个类,甚至更好的不可变结构。如果无法维护的话,即使是最快的代码也毫无价值。
也就是说,你有三个嵌套循环来迭代同一个集合。排序的集合执行速度更快是合理的,因为您只需要与相邻的项目进行比较。
请尝试解释您要完成的工作,以便有人尝试提供更具体的帮助。
答案 1 :(得分:1)
Neater,更多linq:
var data = GetData();
foreach (var v0 in data)
{
if (v0.Key.Item3 != string.Empty) continue;
//Get all related data
var tr_line = data[v0.Key];
sb.AppendLine(tr_line.First());
var hhLines = from v1 in data
where v1.Key.Item2 == string.Empty &&
v1.Key.Item1 == v0.Key.Item1
select data[v1.Key];
foreach (var hh_line in hhLines)
{
sb.AppendLine(hh_line.First());
var grouping = v0;
var enumerable = from v2 in data
where v2.Key.Item1 == grouping.Key.Item1 &&
v2.Key.Item2 != string.Empty &&
v2.Key.Item3 != string.Empty
select data[v2.Key].OrderByDescending(r => r)
into hl_sl_lines from v3 in hl_sl_lines select v3;
foreach (var v3 in enumerable)
{
sb.AppendLine(v3);
}
}
}