var list1 = project.Lists["Список"];//список, где лежат предложения
var list2 = project.Lists["Список2"];//список для результата
List <string> spintax = new List <string>();//временный список
/*----------------------------------------------------------------------------------------------------------------------*/
char[] array1;//массив символов для предложения, с которым сравниваем другие предложения
char[] array2;//массив символов для предложения, которое будет сравнивать
/*----------------------------------------------------------------------------------------------------------------------*/
string result1 = "";//промежуточная переменные для записи первого словесного совпадения
string result2 = "";//промежуточная переменные для конца предложения
/*----------------------------------------------------------------------------------------------------------------------*/
bool start = false;//логическая переменная для проверки было уже совпадение или нет
/*----------------------------------------------------------------------------------------------------------------------*/
int i = 0, j = i + 1, k = 0, l = 0;//счетчики для циклов
/*----------------------------------------------------------------------------------------------------------------------*/
int count = list1.Count;//количество строк в списке с предложениями
/*----------------------------------------------------------------------------------------------------------------------*/
//Цикл для поиска спинтакса. Берется строка из списка по порядку за основу и сверяется с следующими строками для на схожесть
for (i = 0; i < count; i++){
result1 = "";
array1 = list1[i].ToCharArray();
/*----------------------------------------------------------------------------------------------------------------------*/
//Цикл для поиска по списку совпадений. Берем слудющие строки по порядку и сверям с "основной" строкой
for (j = i + 1; j < count; j++){
/*----------------------------------------------------------------------------------------------------------------------*/
//если строка последняя и у нее нет совпадений, то просто заносим ее в итоговый список как есть
try{
/*----------------------------------------------------------------------------------------------------------------------*/
//если два предложения одинаковы, то удаляем последнее
while (list1[i] == list1[j]){
list1.RemoveAt(j);
}
/*----------------------------------------------------------------------------------------------------------------------*/
array2 = list1[j].ToCharArray();
}
catch{
break;
}
/*----------------------------------------------------------------------------------------------------------------------*/
//ищем совпадения до тех пор, пока символы не будут разными, а также записываем начало предложений первый раз
if (result1 == ""){
try{
for (k = 0;; k++){
if (array1[k] != array2[k]){
break;
}
result1 += array1[k].ToString();
}
}
catch{
result2 = "";
continue;
}
}
/*----------------------------------------------------------------------------------------------------------------------*/
//ищем совпадения до тех пор, пока символы не будут разными все последующие разы
else{
array1 = result1.ToCharArray();
try{
for (k = 0; k < array1.Length; k++){
if (array1[k] != array2[k]){
start = true;
break;
}
}
}
catch{
result2 = "";
continue;
}
}
/*----------------------------------------------------------------------------------------------------------------------*/
//если нет совпадения, то двигаемся к следуюущей строке
if (result1 == "" || start){
start = false;
continue;
}
/*----------------------------------------------------------------------------------------------------------------------*/
//в другом случае запоминаем конец предложений
else{
/*----------------------------------------------------------------------------------------------------------------------*/
//если не было еще совпадений, то записываем второую часть основного предложения во вторую переменную
if (spintax.Count == 0){
for (l = k; l < array1.Length; l++){
result2 += array1[l].ToString();
}
spintax.Add(result2);
result2 = "";
}
/*----------------------------------------------------------------------------------------------------------------------*/
//цикл для второго предложения
for (l = k; l < array2.Length; l++){
result2 += array2[l].ToString();//дописываем вторую часть предложения
}
spintax.Add(result2);
result2 = "";
/*----------------------------------------------------------------------------------------------------------------------*/
//удаляем строку, которая совпала
list1.RemoveAt(j);
j--;
}
/*----------------------------------------------------------------------------------------------------------------------*/
//обновляем количество строк в списке
count = list1.Count;
}
/*----------------------------------------------------------------------------------------------------------------------*/
//добавляем в итоговый список готовый спинтакс
if (spintax.Count != 0){
list2.Add(result1 + "{" + String.Join("|", spintax.ToArray()) + "}");
}
/*----------------------------------------------------------------------------------------------------------------------*/
//если не нашло совпадений, то записываем строку как есть
else{
list2.Add(list1[i]);
}
/*----------------------------------------------------------------------------------------------------------------------*/
//очищаем список совпадений
spintax.Clear();
/*----------------------------------------------------------------------------------------------------------------------*/
//обновляем количество строк в списке
count = list1.Count;
}