Сравнение 2-х списков на C# и получить совпадение в переменную

zlodey

Client
Регистрация
24.04.2011
Сообщения
135
Благодарностей
9
Баллы
18
Привет, подскажите как правильно реализовать логику работы кубика на С#

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

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 787
Благодарностей
2 453
Баллы
113
Привет, подскажите как правильно реализовать логику работы кубика на С#

Имеется список1 со строками, далее у нас есть динамический список2 который обновляется, нам нужно при обновлении списка2 выполнить сравнение списка1 со динамеческим списком2, что бы проверить есть ли строки списка1 в списке2, если есть то кладем в переменную myvar найденную строку из списка1 и выходим по зеленой ветке. Но есть один ньюанс, при сравнение списков, в списке1 может быть более одной строки совпадения, если это так то берем рандомную строку и ложим в переменную myvar
C#:
List<string> list1 = new List<string>();
// Демо данные
list1.Add("22");
list1.Add("11");
list1.Add("33");
// list1 = project.Lists["list1"].ToList(); // раскомментировать
List<string> list2 = new List<string>();
// Демо данные
list2.Add("44");
list2.Add("11");
list2.Add("22");
// list2 = project.Lists["list2"].ToList(); // раскомментировать

// Тут все совпадающие строки
List<string> list3 = list2.Intersect(list1).ToList();

// Возвращаем случайную или пустую
project.Variables["myvar"].Value = string.Empty;// очистили
project.Variables["myvar"].Value =  list3.Count > 0 ? list3.OrderBy(x=>Guid.NewGuid()).Take(1).ToList()[0] : string.Empty;
 
  • Спасибо
Реакции: Astraport

zlodey

Client
Регистрация
24.04.2011
Сообщения
135
Благодарностей
9
Баллы
18
C#:
List<string> list1 = new List<string>();
// Демо данные
list1.Add("22");
list1.Add("11");
list1.Add("33");
// list1 = project.Lists["list1"].ToList(); // раскомментировать
List<string> list2 = new List<string>();
// Демо данные
list2.Add("44");
list2.Add("11");
list2.Add("22");
// list2 = project.Lists["list2"].ToList(); // раскомментировать

// Тут все совпадающие строки
List<string> list3 = list2.Intersect(list1).ToList();

// Возвращаем случайную или пустую
project.Variables["myvar"].Value = string.Empty;// очистили
project.Variables["myvar"].Value =  list3.Count > 0 ? list3.OrderBy(x=>Guid.NewGuid()).Take(1).ToList()[0] : string.Empty;
А что за демо данные, не очень понятно
 
Последнее редактирование:

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 787
Благодарностей
2 453
Баллы
113
А что за демо данные, не очень понятно
Чтобы убедиться в корректности работы кода.
Их в рабочем варианте нужно удалить.
Вариант без демо данных будет примерно таким:

C#:
project.Variables["myvar"].Value = string.Empty;

var list1 = project.Lists["list1"].ToList();
var list2 = project.Lists["list2"].ToList();
var list3 = list2.Intersect(list1).ToList();

project.Variables["myvar"].Value =  list3.Count > 0 ? list3.OrderBy(x=>Guid.NewGuid()).Take(1).ToList()[0] : string.Empty;
 
  • Спасибо
Реакции: zlodey

zlodey

Client
Регистрация
24.04.2011
Сообщения
135
Благодарностей
9
Баллы
18
Чтобы убедиться в корректности работы кода.
Их в рабочем варианте нужно удалить.
Вариант без демо данных будет примерно таким:

C#:
project.Variables["myvar"].Value = string.Empty;

var list1 = project.Lists["list1"].ToList();
var list2 = project.Lists["list2"].ToList();
var list3 = list2.Intersect(list1).ToList();

project.Variables["myvar"].Value =  list3.Count > 0 ? list3.OrderBy(x=>Guid.NewGuid()).Take(1).ToList()[0] : string.Empty;
Протестировал в таком варианте:

в списке1 содержимое: domain.com
в списке2: https://www.domain.com/, https://app.domain.com/login, http://origin.domain.com/domains/

Вхождение есть, а результата переменной myvar пустой
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 787
Благодарностей
2 453
Баллы
113
Протестировал в таком варианте:

в списке1 содержимое: domain.com
в списке2: https://www.domain.com/, https://app.domain.com/login, http://origin.domain.com/domains/

Вхождение есть, а результата переменной myvar пустой
Так и должно быть.
По условию код решает задачу проверки на строгое равенство.
Вы же наверно понимаете, что domain.com не равна строке https://www.domain.com/
что бы проверить есть ли строки списка1 в списке2,
Если же нужно, чтобы строки проверялись не по полному совпадению, а по частичному, тогда код может быть другим, например таким:

C#:
project.Variables["myvar"].Value = string.Empty;
var list1 = project.Lists["list1"].ToList();
list1.Add("domain.com");

var list2 = project.Lists["list2"].ToList();
list2.Add("https://www.domain.com/");
list2.Add("https://app.domain.com/login");
list2.Add("http://origin.domain.com/domains/");

var list3 = list2.Where(x => list1.Any(y => x.Contains(y))).ToList();
project.Variables["myvar"].Value =  list3.Count > 0 ? list3.OrderBy(x=>Guid.NewGuid()).Take(1).ToList()[0] : string.Empty;
107949
 
  • Спасибо
Реакции: zlodey

zlodey

Client
Регистрация
24.04.2011
Сообщения
135
Благодарностей
9
Баллы
18
Так и должно быть.
По условию код решает задачу проверки на строгое равенство.
Вы же наверно понимаете, что domain.com не равна строке https://www.domain.com/


Если же нужно, чтобы строки проверялись не по полному совпадению, а по частичному, тогда код может быть другим, например таким:

C#:
project.Variables["myvar"].Value = string.Empty;
var list1 = project.Lists["list1"].ToList();
list1.Add("domain.com");

var list2 = project.Lists["list2"].ToList();
list2.Add("https://www.domain.com/");
list2.Add("https://app.domain.com/login");
list2.Add("http://origin.domain.com/domains/");

var list3 = list2.Where(x => list1.Any(y => x.Contains(y))).ToList();
project.Variables["myvar"].Value =  list3.Count > 0 ? list3.OrderBy(x=>Guid.NewGuid()).Take(1).ToList()[0] : string.Empty;
Посмотреть вложение 107949
Так и должно быть.
По условию код решает задачу проверки на строгое равенство.
Вы же наверно понимаете, что domain.com не равна строке https://www.domain.com/


Если же нужно, чтобы строки проверялись не по полному совпадению, а по частичному, тогда код может быть другим, например таким:

C#:
project.Variables["myvar"].Value = string.Empty;
var list1 = project.Lists["list1"].ToList();
list1.Add("domain.com");

var list2 = project.Lists["list2"].ToList();
list2.Add("https://www.domain.com/");
list2.Add("https://app.domain.com/login");
list2.Add("http://origin.domain.com/domains/");

var list3 = list2.Where(x => list1.Any(y => x.Contains(y))).ToList();
project.Variables["myvar"].Value =  list3.Count > 0 ? list3.OrderBy(x=>Guid.NewGuid()).Take(1).ToList()[0] : string.Empty;
Посмотреть вложение 107949
Вроде все работает спасибо, но я попробовал добавить похожую строку в список2:

C#:
list2.Add("https://www.domain.com/");
list2.Add("https://app.domain.com/login");
list2.Add("http://origin.domain.com/domains/");
list2.Add("https://secure.mydomain.com/");
В результат получили https://secure.mydomain.com/secure/login.bml что не соответствует требуемому, как можно добавить к этому коду проверку что бы правильно брал нужную строку
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 787
Благодарностей
2 453
Баллы
113
Вроде все работает спасибо, но я попробовал добавить похожую строку в список2:

C#:
list2.Add("https://www.domain.com/");
list2.Add("https://app.domain.com/login");
list2.Add("http://origin.domain.com/domains/");
list2.Add("https://secure.mydomain.com/");
В результат получили https://secure.mydomain.com/secure/login.bml что не соответствует требуемому, как можно добавить к этому коду проверку что бы правильно брал нужную строку
Возможно вместо строки:
list1.Add("domain.com");
есть смысл использовать две строки:
list1.Add(".domain.com/");
list1.Add("/domain.com/");
Может быть, в этом виде будет работать как Вы ожидаете.
 
  • Спасибо
Реакции: zlodey

zlodey

Client
Регистрация
24.04.2011
Сообщения
135
Благодарностей
9
Баллы
18
Возможно вместо строки:
list1.Add("domain.com");
есть смысл использовать две строки:
list1.Add(".domain.com/");
list1.Add("/domain.com/");
Может быть, в этом виде будет работать как Вы ожидаете.
Что то слеши не срабатывают
 

zlodey

Client
Регистрация
24.04.2011
Сообщения
135
Благодарностей
9
Баллы
18
Подскажите как правильно экранировать строку

Использую кубик на С, в переменной domain у нас строка domain.com, если в исходнике есть строки mydomain.com, testdomain.com то регекс выдает успех, что не то что мы искали изначально, формат предложенный выше не работает /domain.com/


C#:
// Текст для обработки
string text = project.ExecuteMacro(instance.ActiveTab.DomText);
var errorIfEmpty = true;
var regexGroups = Macros.TextProcessing.Regex(text, @project.Variables["domain"].Value + "[\\w\\W]*?", "0");
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 787
Благодарностей
2 453
Баллы
113
  • Спасибо
Реакции: zlodey

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