Вам следует пересмотреть принятый ответ, потому что производительность со многими предметами плохая.
Возможно, это не имеет значения для текущего количества предметов, но все равно слышу мое предупреждение.
Я выполнил следующеефрагмент кода:
var sb = new StringBuilder();
for (int i = 0; i < asd.Count; i +=3)
sb.AppendLine(string.Join(" ", asd.Skip(i).Take(3)));
Console.WriteLine(sb.ToString());
использовал StringBuilder
для удаления времени, релевантного Console.WriteLine();
для каждого элемента в цикле.
Этот подход требует 756,115ms
для завершения с 1 000 000 элементов.
Создайте список asd
следующим образом:
var asd = Enumerable.Range(0, 1000000).ToList();
Все остальные ответы, приведенные до сих пор, будут работать лучше.
Причина, по которой принятое решение выполняет этоплохо из-за того, что .Skip()
вызывается внутри цикла, он фактически не пропускает и не переходит непосредственно к этой позиции, а снова и снова перебирает список, пока не достигнет этой точки.
Мое решениебудет:
Console.WriteLine(string.Concat(asd.Select((x, i) => (i + 1) % 3 != 0 ? x + " " : x + Environment.NewLine)));
, который выполняет ту же задачу в 8,610ms
Для полноты:
- Решение Войтека принимает:
7,932ms
- Nirmal Subedi 'решениепринимает:
8,088ms
Примечание:
Изменено так, что он использует StringBuilder
для построения строки и выводит строку только один раз на консоль вместо вызова Console.WriteLine()
в цикле
Вот моя полная процедура тестирования:
var asd = Enumerable.Range(0, 1000000).ToList();
var sw1 = new Stopwatch();
sw1.Start();
Console.WriteLine(string.Concat(asd.Select((x, i) => (i + 1) % 3 != 0 ? x + " " : x + Environment.NewLine)));
sw1.Stop();
var sw2 = new Stopwatch();
sw2.Start();
var sb1 = new StringBuilder();
for (int i = 0; i < asd.Count; i += 3)
sb1.AppendLine(string.Join(" ", asd.Skip(i).Take(3)));
Console.WriteLine(sb1.ToString());
sw2.Stop();
var sw3 = new Stopwatch();
sw3.Start();
var sb2 = new StringBuilder();
int counter = 0;
string output = "";
foreach (int value in asd)
{
counter++;
if (counter % 3 == 0)
{
output += value;
sb2.AppendLine(output);
output = string.Empty;
}
else
output += value + " ";
}
Console.WriteLine(sb2.ToString());
sw3.Stop();
var sw4 = new Stopwatch();
sw4.Start();
var sb3 = new StringBuilder();
for (int i = 0; i <asd.Count / 3; i++)
{
int index = i * 3;
sb3.AppendFormat("{0} {1} {2}", asd[index], asd[index + 1], asd[index + 2]);
sb3.AppendLine();
}
Console.WriteLine(sb3.ToString());
sw4.Stop();
Console.WriteLine("MySolution: " + sw1.ElapsedMilliseconds);
Console.WriteLine("Mong Zhu's Solution: " + sw2.ElapsedMilliseconds);
Console.WriteLine("Wojtek's Solution: " + sw3.ElapsedMilliseconds);
Console.WriteLine("Nirmal Subedi's Solution: " + sw4.ElapsedMilliseconds);
Console.ReadKey();