rediffusion
11/4/2017 - 3:32 PM

Удалить дубли

//Подменю "Таблицы-Операции над таблицей". Действие "Удалить дубли"

//Создаём объект класса IZennoTable, привязываемся к списку уровня проекта
IZennoTable tblTest = project.Tables["Таблица 1"];
tblTest.Clear(); //очищаем таблицу

//наполняем таблицу тестовыми значениями
tblTest.AddRow(new String[]{"Это", "первая", "строка"});
tblTest.AddRow(new String[]{"Это", "первая", "строка"});
tblTest.AddRow(new String[]{"Это", "первая", "страка"});
tblTest.AddRow(new String[]{"Это", "вторая", "строка"});
tblTest.AddRow(new String[]{"Это", "третья", "строка"});

//Удаляем дубли по всем столбцам
List<string> lstTemp = new List<string>();
string strDedupDelimiter = "<deadup>";
for (int i=0;i<tblTest.RowCount;i++) {
	lstTemp.Add(String.Join(strDedupDelimiter,tblTest.GetRow(i)));
}
tblTest.Clear();
foreach(string strUniqueString in lstTemp.Distinct()) {
	tblTest.AddRow(Regex.Split(strUniqueString, Regex.Escape(strDedupDelimiter)));
}

//Удаляем дубли по выбранным столбцам
int[] arrColumns = new Int32[]{0,1}; //массив, содержащий номера столбцов
List<string> lstDedup = new List<string>();
int intTableString = 0;
string strDelimiter = "<deadup>";
while(true) {
	if (intTableString==tblTest.RowCount) break;
	
	string strColString = String.Empty;
	for(int i=0;i<arrColumns.Count();i++){
		strColString += tblTest.GetCell(arrColumns[i],intTableString);
		if (i<arrColumns.Count()-1) strColString += strDelimiter;
	}
	if (lstDedup.Contains(strColString)){
		tblTest.DeleteRow(intTableString);
	}else{
		lstDedup.Add(strColString);
		intTableString++;
	}
}

project.SendInfoToLog("Выполнено. Проверьте содержимое таблицы Таблица 1");

//Примечания: