C# Lookup предложение оптимизация приветствуются
У меня есть код ниже, который работает для того, что мне нужно, но у меня есть идея, что это может быть сделано быстрее. Пожалуйста, дайте мне знать, если этот код может быть улучшен каким-либо образом...
Основная проблема заключается в том, что мне нужно несколько раз запрашивать "данные". Мне просто нужно убедиться, что нет ярлыка, который я мог бы использовать вместо этого.
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);
}
}
}
}
}
}
}
2 ответа
Аккуратнее, больше 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);
}
}
}
Прежде всего, постарайтесь избегать использования Tuple для такого рода кода, потому что даже для вас, через несколько месяцев, этот код будет непонятным. Сделайте класс или, что еще лучше, неизменную структуру с правильными именами свойств. Даже самый быстрый код бесполезен, если он не поддерживается.
Тем не менее, у вас есть три вложенных цикла, которые повторяют одну и ту же коллекцию. Было бы правдоподобно, что отсортированная коллекция будет работать быстрее, так как вам нужно будет сравнивать только соседние элементы.
Пожалуйста, попытайтесь объяснить, чего вы пытаетесь достичь, чтобы кто-то попытался предложить более конкретную помощь.