очистить всю таблицу C#

Bot_Sculptor

Client
Регистрация
11.06.2012
Сообщения
787
Благодарностей
239
Баллы
43
есть в C# встроенная функция для очистки таблицы?
таблица не привязана к файлу,

т.к. если брать сейчас стандартным методом в мейкере, а это аля взять первую строку с удалением, и так до тех пор пока строки не закончатся.
так вот если таких строк 1кк , то это сколько займет, час?

нужна возможность очистить сразу всю таблицу, без цикла...
 

Bot_Sculptor

Client
Регистрация
11.06.2012
Сообщения
787
Благодарностей
239
Баллы
43

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
такого метода на данный момент нет, таску поставил сделаем.
Вообще сейчас провел тест 1кк строк удаляет 67 ms главное не забудь обернуть в lock, чтобы другие потоки к ней в этот момент не долбились.
lock(SyncObjects.TableSyncer)
{
//чистим таблицу
}
 
  • Спасибо
Реакции: Bot_Sculptor

Bot_Sculptor

Client
Регистрация
11.06.2012
Сообщения
787
Благодарностей
239
Баллы
43
а я в шарпе циклом не пробовал удалять,
я экшенами сделал цикл и вижу что оно слегка долго удаляет, что в мекере, что в постере, подумал что в c# будет тоже самое, а у тебя всего лишь 67мс это круто, спасибо
просто, поскольку перед выполнением шаблон компилируется в C# , да? то я и подумал, что на c# если сделать циклом будет тоже самое, что и цикл в мейкере, а тут вот оно как!
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
901
Баллы
113
А вы попробуйте) вдруг выстрелит)
Хотя имхо там видимо не DataTable а какой то объект зеннопостера.
Если что вот напрямую из CodeCreator кусочек кода. Работает)))
Код:
public int ExecuteCode(Instance instance, IZennoPosterProjectModel project)
		{
			int executionResult = 0;
			System.Data.DataTable tab = new DataTable("Табличко");
			tab.Columns.Add(new DataColumn("колонко1"));
			for(int i=0;i<3;i++)
			{
			tab.Rows.Add("данные");
			}
			tab.Clear();
			return executionResult;
		}
А вообще согласен))) внедрить это поидее не сложно, а пригодилось бы прилично)
 
  • Спасибо
Реакции: Bot_Sculptor

Bot_Sculptor

Client
Регистрация
11.06.2012
Сообщения
787
Благодарностей
239
Баллы
43
а как бы это внедрить в сниппет c# в мейкер?

вот начинаю экспериментировать, т.к. планирую все же взятся за C#.. Хоть и не нужно начинать с зенно в этом плане)
но все же
вот так
PHP:
lock(SyncObjects.TableSyncer){    while (project.Tables["test"].RowCount > 0)    {        project.Tables["test"].DeleteRow(0);        }}
насколько я вижу это тоже самое(долго) что и делать простой цикл в мейкере через экшены...
а если сделать циклом for то может ситуация изменится )
up^ for также быстро делает это как и while (сарказм))


darkdiver, я жду твой вариант на 67ms ) , т.к. моих громоздких познаний в C# не хватает, чтобы добиться такого.
lock не нужен, таблица не привязана к файлу,
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
901
Баллы
113
Гм))) а почему бы не воспользоваться таким кривым финтом?)) (Да да я мастер удалять гланды через...)
Взять и привязать таблицу к пустому фаилу?)))
или скажем, привязать таблицу к фаилу, а потом удалить его содержимое?)

А что у вас за задача то? если уж более предметно?))) может там и не надо 1000 000 строк удалять... завершить проект и пусть оно при завершении проекта само из памяти удалится?
 
  • Спасибо
Реакции: Bot_Sculptor

Bot_Sculptor

Client
Регистрация
11.06.2012
Сообщения
787
Благодарностей
239
Баллы
43
ну если точнее то 500к строк удалять 20мб это в данном случае.
талица не синхронизирована с файлом, она только в опр. момент сохранит эти 500к строк в файл, дальше эту таблицу нужно очистить быстро, и потом как там опять наберется 500к она сохранит уже в другой файл и так до опр. момента.
да, с привязкой к пустому файлу это будет я вижу само быстро и безболезненно)

хотя о чем это я) такой вариант тут же не пройдет, т.к. после привязки, как отвязать)? ахах

сейчас придет darkdiver черкнет 4 строки кода и все будет хорошо -_-
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
901
Баллы
113
Пока он не пришел (Если что я буду рад видеть его в соседнем топике))))
А что мешает привязать таблицу дальше по ходу дела к другому фаилу?))))))
 

Bot_Sculptor

Client
Регистрация
11.06.2012
Сообщения
787
Благодарностей
239
Баллы
43
Пока он не пришел (Если что я буду рад видеть его в соседнем топике))))
А что мешает привязать таблицу дальше по ходу дела к другому фаилу?))))))
не-не такое не годится :cool:
 

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
ну вообще мой вариант вот такой
JavaScript:
lock(SyncObjects.TableSyncer)
{
	var table = project.Tables["Table1"];
	//var sw = System.Diagnostics.Stopwatch.StartNew();
	for(int i = table.RowCount - 1; i>=0; i--)
	{
		table.DeleteRow(i);
	}
	//sw.Stop();
	//return sw.ElapsedMilliseconds;
}
если раскомментаришь закомментаренные строчки, то вернется в переменную сколько ms было потрачено.

67 ms - это на Intel Core I5 3Ghz, таблица привязана как таблица, которая имеет собственный формат.
Если формат Excel или CSV какой нибудь, то ~300ms работает.
 
  • Спасибо
Реакции: myweb101 и Bot_Sculptor

Bot_Sculptor

Client
Регистрация
11.06.2012
Сообщения
787
Благодарностей
239
Баллы
43
пока я не пошел экспериментировать,
вижу что таблица из шаблона грузится в переменную table
var table = project.Tables["Table1"];

так вот, после очистки в C# свой код, она очистится в таблице "Table1" из проекта?

 

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
Table1 - это название таблицы в проекте.
переменная table - это просто метод обращения к таблице проекта.
в вашем случае
JavaScript:
while (project.Tables["test"].RowCount > 0)    
{        project.Tables["test"].DeleteRow(0);        }
львиную долю времени занимает двойной вызов project.Tables["test"] сначала при проверке числа записей, потом удаление строки.
да и строки лучше удалять с конца, чтобы лишний раз не вызывать перепаковку массива.
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
901
Баллы
113
Какой то комп тормозной видимо у меня...
Таблица в памяти...
и вот такое время(
http://joxi.ru/NODoUhjKTJCYIf7vdyw
 

Bot_Sculptor

Client
Регистрация
11.06.2012
Сообщения
787
Благодарностей
239
Баллы
43
Table1 - это название таблицы в проекте.
переменная table - это просто метод обращения к таблице проекта.
в вашем случае
JavaScript:
while (project.Tables["test"].RowCount > 0)    
{        project.Tables["test"].DeleteRow(0);        }
львиную долю времени занимает двойной вызов project.Tables["test"] сначала при проверке числа записей, потом удаление строки.
да и строки лучше удалять с конца, чтобы лишний раз не вызывать перепаковку массива.
в том и беда, выше я писал так, пробовал
while (project.Tables["test"].RowCount > 0)
{ project.Tables["test"].DeleteRow(0); }

i7 8gbRam ssd

так вот и не стал дожидаться выполнения того кода, т.к. долго, да проблема в обращении 1кк раз к таблице project.Tables["test"]
это из-за этого такая скорость?

то мне нужен скоростной вариант вот этот:
lock(SyncObjects.TableSyncer)
{
var table = project.Tables["Table1"];
//var sw = System.Diagnostics.Stopwatch.StartNew();
for(int i = table.RowCount - 1; i>=0; i--)
{
table.DeleteRow(i);
}
//sw.Stop();
//return sw.ElapsedMilliseconds;
}

только в конце дописать чтобы таблица Table1 приняла (синхронизировалась) с переменной массивом table в итоге получили пустую таблицу в Проекте
а не просто в коде c# там в переменной куда мы загрузили таблицу из проекта.
так можно сделать?
 

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
переменная table - это не копия, это и есть сам объект таблицы. Ничего синхронизировать не надо.
 
  • Спасибо
Реакции: Bot_Sculptor

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
вы случаем не в CodeCreator работаете, там отладка очень медленная для таблиц (т.к. происходит общение между процессами)
При выполнении в постере, все летать будет.
 

Bot_Sculptor

Client
Регистрация
11.06.2012
Сообщения
787
Благодарностей
239
Баллы
43
я в мейкере юзал, c# код вставки
вот сейчас если так:
переменная table - это не копия, это и есть сам объект таблицы

то это отлично, и я получу пустую таблицу, ну сейчас уж проверю...
 

Bot_Sculptor

Client
Регистрация
11.06.2012
Сообщения
787
Благодарностей
239
Баллы
43
о чудо!
238ms

таблица xlsx 510k str 23mb
и она очистилась!
 

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
ну и прекрасно )))
 

Bot_Sculptor

Client
Регистрация
11.06.2012
Сообщения
787
Благодарностей
239
Баллы
43
из всей темы истина хранится вот тут
и сказал darkdiver :
переменная table - это не копия, это и есть сам объект таблицы.

а это все поменяло)
Спасибо!
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
В новом билде будет метод очистки таблицы, сделали)
 
  • Спасибо
Реакции: surrealmix

famous1144

Client
Регистрация
27.03.2014
Сообщения
137
Благодарностей
53
Баллы
28

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
имелось в ввиду в билде, который выйдет после 5.3.1
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113

Bot_Sculptor

Client
Регистрация
11.06.2012
Сообщения
787
Благодарностей
239
Баллы
43
У меня 5.4.3.0, но не могу найти данную "фичу".
Подскажите, пожалуйста, где искать?
имеется ввиду, что этот метод .clear() юзать в коде C#. А не в экшенах, как операции со списками и т.п.
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
имеется ввиду, что этот метод .clear() юзать в коде C#. А не в экшенах, как операции со списками и т.п.
А как воспользоваться методом, не подскажите? А то с C# совсем туго :-)
 

Bot_Sculptor

Client
Регистрация
11.06.2012
Сообщения
787
Благодарностей
239
Баллы
43
там выше же есть примера кода C#
вставляете его в экшен свой код c#
создаете таблицу, имя "Table1" меняете на свое в коде c#
вот админ привел пример кода
Код:
lock(SyncObjects.TableSyncer)
{
    var table = project.Tables["Table1"];
    //var sw = System.Diagnostics.Stopwatch.StartNew();
    for(int i = table.RowCount - 1; i>=0; i--)
    {
        table.DeleteRow(i);
    }
    //sw.Stop();
    //return sw.ElapsedMilliseconds;
}
это так делалось ранее, когда еще не было метода clear
а сейчас это делается вот так:

project.Tables["Table 1"].Clear();
 
Последнее редактирование:
  • Спасибо
Реакции: ibred

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
project.Tables["Table 1"].Clear();
У меня почему-то не работает:
Компиляция кода Ошибка в действии "CS0815" "Не удается задать "void" для неявно типизированной локальной переменной". [Строка: 1; Cтолбец: 5]

Код:
var table = project.Tables["table1"].Clear();
return table;
 

Bot_Sculptor

Client
Регистрация
11.06.2012
Сообщения
787
Благодарностей
239
Баллы
43
У меня почему-то не работает:
Компиляция кода Ошибка в действии "CS0815" "Не удается задать "void" для неявно типизированной локальной переменной". [Строка: 1; Cтолбец: 5]

Код:
var table = project.Tables["table1"].Clear();
return table;
а сейчас это делается вот так:

project.Tables["Table 1"].Clear();
без var table = и return
 

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)