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

zlodey

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

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

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 893
Благодарностей
2 624
Баллы
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
Сообщения
140
Благодарностей
13
Баллы
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
Сообщения
5 008
Благодарностей
4 482
Баллы
113

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 893
Благодарностей
2 624
Баллы
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
Сообщения
140
Благодарностей
13
Баллы
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 893
Благодарностей
2 624
Баллы
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
Сообщения
140
Благодарностей
13
Баллы
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 893
Благодарностей
2 624
Баллы
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
Сообщения
140
Благодарностей
13
Баллы
18
Возможно вместо строки:
list1.Add("domain.com");
есть смысл использовать две строки:
list1.Add(".domain.com/");
list1.Add("/domain.com/");
Может быть, в этом виде будет работать как Вы ожидаете.
Что то слеши не срабатывают
 

zlodey

Client
Регистрация
24.04.2011
Сообщения
140
Благодарностей
13
Баллы
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 893
Благодарностей
2 624
Баллы
113
  • Спасибо
Реакции: zlodey

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