Более эффективная петля?

90
12

Итак, я пишу простую структуру, чтобы действовать как массив строк, но с некоторыми удобными операторами и другими функциями, которые я всегда хотел видеть в строках. В частности, метод, над которым я сейчас работаю, - это оператор /. Проблема заключается в том, что она не добавит никаких остатков в конце, как я хочу.


Что он должен делать, принимает массив строк, например {"Hello", "Test1", "Test2", "Goodbye", "More?", "Qwerty"} и, скажем, я хочу разделить на 4, он должен возвращать { {"Hello", "Test1", "Test2", "Goodbye"}, {"More?", "Qwerty"} }, но это не так.


Весь класс (метод, который я хочу улучшить, это оператор /, но если вы увидите что-нибудь еще, над чем я смогу работать, укажите его) (я знаю, что почти ничего не прокомментировано. ожидайте, что кто-нибудь еще увидит этот код в стороне от меня.):


public struct StringCollection
{
private String[] value;

public StringCollection(params String[] s)
{
this.value = s;
}

public StringCollection(StringCollection current, String ad)
{
if (current.value == null) {
current.value = new String[0] { };
}
this.value = new String[current.value.Length+1];
for (int i=0; i<this.value.Length; i++)
{
try {
this.value[i] = current[i];
} catch {
break;
}
}
this.value[this.value.Length-1] = ad;
}
public StringCollection(StringCollection x, params StringCollection[] y)
{
this.value = x.value;
for (int j=0;j<y.Length;j++)
{
for (int i=0;i<y[j].value.Length;i++)
{
this += y[j][i];
}
}
}

public static StringCollection[] operator /(StringCollection x, int y)
{
StringCollection[] result = null;
if (((int)x.value.Length/y) == ((double)x.value.Length)/y)
result = new StringCollection[y];
else
result = new StringCollection[y+1];
for (int j=0;j<y;j++)
{
for (int i=0;i<((int)x.value.Length/y);i++)
{
result[j] += x.value[i+(int)((x.value.Length/y)*j)];
}
}
if (((int)x.value.Length/y) != ((double)x.value.Length)/y)
{
// This is the part that isn't working.
for (int i=0;i<(((int)x.value.Length/y)*result[0].value.Length)-x.value.Length;i++)
{
result[result.Length-1] += x.value[i+((result[0].value.Length)*result.Length-2)];
}
}
return result;
}
public String this[int index]
{
get {
return this.value[index];
}
set {
this.value[index] = value;
}
}

}


То, что он делает, в основном принимает ваш массив (один массив) и разбивает его на кучу массивов одинакового размера, а затем добавляет остаток в новый массив в конце.

спросил(а) 2021-01-25T15:55:57+03:00 5 месяцев назад
1
Решение
63

Во-первых, ваш вопрос вообще не связан с циклами, или, по крайней мере, циклы рассматриваются только в вашем коде. Вы бы назвали это по-другому.


Во-вторых, вы можете улучшить добавление/удаление массива; то есть добавление 1 к размеру массива каждый раз и удаление 1, а затем повторное копирование всего массива каждый раз является временным потоком.


Теперь на ваш вопрос ваш код должен выглядеть примерно так:


//Make your return array
int retLen = x.Length / y;

//Add space for the remainder
if(x.Length % y != 0)
retLen++;

var ret = new StringCollection[retLen];

//Reusing variables is a good way to save memory, but watch naming conventions as this can be confusing
retLen = 0;

var tempCollection = new StringCollection();

for (int i = 0; i < x.Length; i++)
{
tempCollection = new StringCollection(tempCollection, x[i]);

if(i % y == 0 || i == x.Length - 1)
{
ret[retLen++] = tempCollection;
tempCollection = new StringCollection();
retLen = 0;
}
}

return ret;

Мне действительно не нравится, что у вас нет функции Add в этой структуре, так что мы понятны. tempCollection = new StringCollection(tempCollection, x[i]); является f $* kin 'TERRIBLE, когда дело доходит до времени CPU, чтобы создать все эти новые объекты.


Довольно уверен, что вам нужно будет настроить это, чтобы убедиться, что все элементы введены правильно, но это была первая попытка, поэтому... meh oO Figured, так как никто на самом деле не собирался отвечать вам, я бы потратил время.


РЕДАКТИРОВАТЬ: нашел ошибку, забыл вернуть retLen в 0 при добавлении в ret

ответил(а) 2021-01-25T15:55:57+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема