C# string.Contains необходима помощь гуру

jasblack

Client
Регистрация
12.06.2016
Сообщения
42
Благодарностей
2
Баллы
8
насколько я понимаю string.Contains() должен искать наличие текста из ресурса.
есть данный код:
Код:
// берем из переменной текст, который надо искать
var textContains = project.Variables["search"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["log_pass"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        // читаем строку из списка
        var str = sourceList[i];
        // проверяем содержание текста в строке, если есть совпадение возвращаем "yes"
        if (str.Contains(textContains))
        {
return "yes";
}
}
}
// если ничего не нашли возвращаем "no"
return "no";
в списке данные следующего типа "login1234:password1234"
столкнулся с следующей проблемой:
если в переменной search значение "login12" или "ogin1234" или "ssword1234" или "pass"
то сниппет возвращает yes,
но у меня переменная search иногда принимает значение "login1234:assword1234" "oin1234" "logn124:password1234", т.е. в сравнение со значениями в списке выпадают символы.
И тогда сниппет возвращает "no".
Можно ли средствами С# исправить данный код, дабы добиться нужного мне результата, или же только брутально добавлять значения в список?
 

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
457
Баллы
63
Строку "login1234:assword1234" разделить на две переменные и каждую строку списка проверить 2 раза по Contains
А вообще
т.е. в сравнение со значениями в списке выпадают символы.
В хорошо спроектированном проекте такого не должно быть.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Строку "login1234:assword1234" разделить на две переменные и каждую строку списка проверить 2 раза по Contains
А вообще

В хорошо спроектированном проекте такого не должно быть.
в его примере есть oin1234
Тут как не разделяй
 

patlat

Client
Регистрация
21.09.2016
Сообщения
175
Благодарностей
47
Баллы
28

jasblack

Client
Регистрация
12.06.2016
Сообщения
42
Благодарностей
2
Баллы
8
в его примере есть oin1234
Тут как не разделяй
Вот и я о том же:dy: в C# не силен, думал может какие еще есть методы поиска...
На ум приходит только одно разбивать строки в массив символов, потом сравнивать массивы на количество совпадений.... Но это прям адище какой то, проще список дописать
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Вот и я о том же:dy: в C# не силен, думал может какие еще есть методы поиска...
На ум приходит только одно разбивать строки в массив символов, потом сравнивать массивы на количество совпадений.... Но это прям адище какой то, проще список дописать
да, только такой вариант и может быть. Но, во первых, он будет находить не мало лишки, во вторых, мне кажется, что можно найти в общем более удобный подход, если отказаться от текущей логики
 
  • Спасибо
Реакции: jasblack

jasblack

Client
Регистрация
12.06.2016
Сообщения
42
Благодарностей
2
Баллы
8
а что именно вы хотите, чтоб выполнял код?
чтобы при сравнении значений, код выдавал true ища "loin13" в "login1234". То есть, если выражусь сейчас правильно, чтобы в строке списка поиск происходил не подстроки, а именно символов, дабы в случае выпавших символов приходил положительный ответ.
 

jasblack

Client
Регистрация
12.06.2016
Сообщения
42
Благодарностей
2
Баллы
8
да, только такой вариант и может быть. Но, во первых, он будет находить не мало лишки, во вторых, мне кажется, что можно найти в общем более удобный подход, если отказаться от текущей логики
Может намекнете в лс в какую сторону можно поменять логику?:-)
 

patlat

Client
Регистрация
21.09.2016
Сообщения
175
Благодарностей
47
Баллы
28
чтобы при сравнении значений, код выдавал true ища "loin13" в "login1234"
вообщем другими словами, чтоб все символы в меньшей строке, присутствовали в большой строке, так?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Может намекнете в лс в какую сторону можно поменять логику?:-)
я имею ввиду изначальную логику, которая приводит к необходимости искать битые значения. Возможно, можно как-то обойти битость или что-то подобное.
А подсказать по логике что-либо сложно, ибо я не знаю, как она устроена, что делает, что желает получить в результате
 

jasblack

Client
Регистрация
12.06.2016
Сообщения
42
Благодарностей
2
Баллы
8

jasblack

Client
Регистрация
12.06.2016
Сообщения
42
Благодарностей
2
Баллы
8
я имею ввиду изначальную логику, которая приводит к необходимости искать битые значения. Возможно, можно как-то обойти битость или что-то подобное.
А подсказать по логике что-либо сложно, ибо я не знаю, как она устроена, что делает, что желает получить в результате
раппорт телекинеза не состоялся:D8-) но все же спасибо
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Если, все же остаться в текущей точке, алгоритм будет примерно таков
Мы перебираем символы искомой строки (oin1234, например). Ищем первое вхождение в строке поиска (login1234:password1234). Если находим вхождение символа - обрезаем строку поиска по нему, берем след символ искомой строки и ищем его уже в обрезанной строке поиска. И так по кругу. Если на какой-то иттерации вхождения символа не нашли - значит и вхождения искомой строки нет.
 

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
457
Баллы
63
Берем вашу строку для поиска.
Далее берем строку из списка.
Затем в цикле сравниваем каждый символ вашей строки со строкой из списка, если все символы найдены, значит возвращаем результат, иначе переходим к следующей строке в списке.
 
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113
насколько я понимаю string.Contains() должен искать наличие текста из ресурса.
есть данный код:
Код:
// берем из переменной текст, который надо искать
var textContains = project.Variables["search"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["log_pass"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        // читаем строку из списка
        var str = sourceList[i];
        // проверяем содержание текста в строке, если есть совпадение возвращаем "yes"
        if (str.Contains(textContains))
        {
return "yes";
}
}
}
// если ничего не нашли возвращаем "no"
return "no";
в списке данные следующего типа "login1234:password1234"
столкнулся с следующей проблемой:
если в переменной search значение "login12" или "ogin1234" или "ssword1234" или "pass"
то сниппет возвращает yes,
но у меня переменная search иногда принимает значение "login1234:assword1234" "oin1234" "logn124:password1234", т.е. в сравнение со значениями в списке выпадают символы.
И тогда сниппет возвращает "no".
Можно ли средствами С# исправить данный код, дабы добиться нужного мне результата, или же только брутально добавлять значения в список?
))) теперь я понимаю почему так!
Вы поиском то не пользуетесь вообще? Тему поднимали мильон500 раз уже!
Это не точный поиск, отсюда все проблемы, поиск по совпадению хотябы одного символа идет!
чтобы все было нормально делаем так!
Код:
это
if (str.Contains(textContains))
заменить на это
if (str==textContains)
Не забудьте записать, а то завтра забудете!
 
  • Спасибо
Реакции: luserz

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
457
Баллы
63
))) теперь я понимаю почему так!
Вы поиском то не пользуетесь вообще? Тему поднимали мильон500 раз уже!
Это не точный поиск, отсюда все проблемы, поиск по совпадению хотябы одного символа идет!
чтобы все было нормально делаем так!
Код:
это
if (str.Contains(textContains))
заменить на это
if (str==textContains)
Не забудьте записать, а то завтра забудете!
В твоем случае идет сравнение строк посимвольно.
Если количество символов разное в строках, соответственно результат будет не верный.
 
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113
В твоем случае идет сравнение строк посимвольно.
Если количество символов разное в строках, соответственно результат будет не верный.
главное отрабатывает правильно!
Если в переменно "1" а в списке "текст 1" "текст 123" - то это не будет "ок"
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
главное отрабатывает правильно!
Если в переменно "1" а в списке "текст 1" "текст 123" - то это не будет "ок"
ему нужно, чтобы, например, "текст13" находился при поиске в строке "текст123"
 
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113
ему нужно, чтобы, например, "текст13" находился при поиске в строке "текст123"
воЁ! Заняться то ему больше нечем, искать то чего нет!
Регулярочку в зубы и погнал, раз такой изощренный!
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
C#:
var reg = new Regex("\\w{1}");
var search = project.Variables["search"].Value;;
var result = from Match match in reg.Matches(search) select match.Value;

var sourceList = project.Lists["log_pass"];

lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        var str = sourceList[i];
       
        foreach (var r in result)
        {
            if (str.Contains(r))
            {
                continue;
            }
            else
                return "no";
        }
    }
}
return "yes";
 

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
457
Баллы
63
Добавил пару строк в ваш код:
Код:
            // берем из переменной текст, который надо искать
            var textContains = project.Variables["search"].Value;
            // получаем список, в котором будем искать
            var sourceList = project.Lists["log_pass"];
            // ищем в каждой строчке в списке
            lock (SyncObjects.ListSyncer)
            {
                for (int i = 0; i < sourceList.Count; i++)
                {
                    // читаем строку из списка
                    var str = sourceList[i];
                    // проверяем содержание текста в строке, если есть совпадение возвращаем "yes"
                    bool isContains = true;
                    foreach (char c in textContains)
                    {
                        if (!str.Contains(c))
                        {
                            isContains = false;
                            break;
                        }
                    }

                    if (isContains)
                    {
                        return "yes";
                    }
                }
            }
            // если ничего не нашли возвращаем "no"
            return "no";
        }
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
C#:
var reg = new Regex("\\w{1}");
var search = project.Variables["search"].Value;;
var result = from Match match in reg.Matches(search) select match.Value;

var sourceList = project.Lists["log_pass"];

lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        var str = sourceList[i];
      
        foreach (var r in result)
        {
            if (str.Contains(r))
            {
                continue;
            }
            else
                return "no";
        }
    }
}
return "yes";
этот код, похоже, направлен на поиск анаграмм. Вряд ли перестановки приемлемы.
Более того, я не могу найти завершения, если строка все же найдена. Сниппет окончит работу с НО, если 1 символ в 1й попавшейся строке не подойдет, и цикл завершится с ЕС, если переберутся все строки и в каждой будет вхождение всех символов искомой строки. Так и задумано?
 
  • Спасибо
Реакции: jasblack

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
Добавил пару строк в ваш код:
Код:
            // берем из переменной текст, который надо искать
            var textContains = project.Variables["search"].Value;
            // получаем список, в котором будем искать
            var sourceList = project.Lists["log_pass"];
            // ищем в каждой строчке в списке
            lock (SyncObjects.ListSyncer)
            {
                for (int i = 0; i < sourceList.Count; i++)
                {
                    // читаем строку из списка
                    var str = sourceList[i];
                    // проверяем содержание текста в строке, если есть совпадение возвращаем "yes"
                    bool isContains = true;
                    foreach (char c in textContains)
                    {
                        if (!str.Contains(c))
                        {
                            isContains = false;
                            break;
                        }
                    }

                    if (isContains)
                    {
                        return "yes";
                    }
                }
            }
            // если ничего не нашли возвращаем "no"
            return "no";
        }
а з-ачем, если все символы есть выйдет по yes если нет то no
 
  • Спасибо
Реакции: jasblack

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
457
Баллы
63
а з-ачем, если все символы есть выйдет по yes если нет то no
Такой алгоритм не идеален, даже наоборот, но более похож под суть задачи, хотя если еще предусмотреть порядок символов и количество вхождений.
 
  • Спасибо
Реакции: jasblack

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
457
Баллы
63
Вопрос к ssXXXss: Каким тегом вставлять код C# на данном форуме, чтобы была реализована подсветка синтаксиса?
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
даже вот так

C#:
var reg = new Regex("\\w{1}");
var search = project.Variables["search"].Value;;
var result = from Match match in reg.Matches(search) select match.Value;
var sourceList = project.Lists["log_pass"];
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        var str = sourceList[i];
      
        foreach (var r in result)
        {
            if (!str.Contains(r))
            {
                return "no";
            }
        }
    }
}
return "yes";
 
  • Спасибо
Реакции: jasblack

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
  • Спасибо
Реакции: masterLomaster и VerBin

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
457
Баллы
63
Слово ГУРУ в названии топика творит чудеса, я насчитал несколько кодеров, что вцепились в тему, может из за того, что сейчас ночь :D
Под покровом ночи эти создания пишут код :D
 
  • Спасибо
Реакции: masterLomaster

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
у меня 9.20 утра покрайней мере
 

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
457
Баллы
63

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