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

  • Автор темы Автор темы zlodey
  • Дата начала Дата начала

zlodey

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

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

Имеется список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
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;
А что за демо данные, не очень понятно
 
Последнее редактирование:
А что за демо данные, не очень понятно
Чтобы убедиться в корректности работы кода.
Их в рабочем варианте нужно удалить.
Вариант без демо данных будет примерно таким:

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
Чтобы убедиться в корректности работы кода.
Их в рабочем варианте нужно удалить.
Вариант без демо данных будет примерно таким:

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 пустой
 
Протестировал в таком варианте:

в списке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
Так и должно быть.
По условию код решает задачу проверки на строгое равенство.
Вы же наверно понимаете, что 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 что не соответствует требуемому, как можно добавить к этому коду проверку что бы правильно брал нужную строку
 
Вроде все работает спасибо, но я попробовал добавить похожую строку в список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
Возможно вместо строки:
list1.Add("domain.com");
есть смысл использовать две строки:
list1.Add(".domain.com/");
list1.Add("/domain.com/");
Может быть, в этом виде будет работать как Вы ожидаете.

Что то слеши не срабатывают
 
Подскажите как правильно экранировать строку

Использую кубик на С, в переменной 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");
 
Подскажите как правильно экранировать строку
C#:
Развернуть Свернуть Копировать
string line = @"/ / / \ \ \"; // собачку ставим перед кавычками. если кавычки - дублировать их ещё раз
 
  • Оценить
Реакции: zlodey

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