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

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

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".
Можно ли средствами С# исправить данный код, дабы добиться нужного мне результата, или же только брутально добавлять значения в список?
 
Строку "login1234:assword1234" разделить на две переменные и каждую строку списка проверить 2 раза по Contains
А вообще
т.е. в сравнение со значениями в списке выпадают символы.
В хорошо спроектированном проекте такого не должно быть.
 
Строку "login1234:assword1234" разделить на две переменные и каждую строку списка проверить 2 раза по Contains
А вообще

В хорошо спроектированном проекте такого не должно быть.
в его примере есть oin1234
Тут как не разделяй
 
в его примере есть oin1234
Тут как не разделяй
Вот и я о том же:dy: в C# не силен, думал может какие еще есть методы поиска...
На ум приходит только одно разбивать строки в массив символов, потом сравнивать массивы на количество совпадений.... Но это прям адище какой то, проще список дописать
 
Вот и я о том же:dy: в C# не силен, думал может какие еще есть методы поиска...
На ум приходит только одно разбивать строки в массив символов, потом сравнивать массивы на количество совпадений.... Но это прям адище какой то, проще список дописать
да, только такой вариант и может быть. Но, во первых, он будет находить не мало лишки, во вторых, мне кажется, что можно найти в общем более удобный подход, если отказаться от текущей логики
 
  • Оценить
Реакции: jasblack
а что именно вы хотите, чтоб выполнял код?
чтобы при сравнении значений, код выдавал true ища "loin13" в "login1234". То есть, если выражусь сейчас правильно, чтобы в строке списка поиск происходил не подстроки, а именно символов, дабы в случае выпавших символов приходил положительный ответ.
 
да, только такой вариант и может быть. Но, во первых, он будет находить не мало лишки, во вторых, мне кажется, что можно найти в общем более удобный подход, если отказаться от текущей логики
Может намекнете в лс в какую сторону можно поменять логику?:-)
 
чтобы при сравнении значений, код выдавал true ища "loin13" в "login1234"
вообщем другими словами, чтоб все символы в меньшей строке, присутствовали в большой строке, так?
 
Может намекнете в лс в какую сторону можно поменять логику?:-)
я имею ввиду изначальную логику, которая приводит к необходимости искать битые значения. Возможно, можно как-то обойти битость или что-то подобное.
А подсказать по логике что-либо сложно, ибо я не знаю, как она устроена, что делает, что желает получить в результате
 
я имею ввиду изначальную логику, которая приводит к необходимости искать битые значения. Возможно, можно как-то обойти битость или что-то подобное.
А подсказать по логике что-либо сложно, ибо я не знаю, как она устроена, что делает, что желает получить в результате
раппорт телекинеза не состоялся:D8-) но все же спасибо
 
Если, все же остаться в текущей точке, алгоритм будет примерно таков
Мы перебираем символы искомой строки (oin1234, например). Ищем первое вхождение в строке поиска (login1234:password1234). Если находим вхождение символа - обрезаем строку поиска по нему, берем след символ искомой строки и ищем его уже в обрезанной строке поиска. И так по кругу. Если на какой-то иттерации вхождения символа не нашли - значит и вхождения искомой строки нет.
 
Берем вашу строку для поиска.
Далее берем строку из списка.
Затем в цикле сравниваем каждый символ вашей строки со строкой из списка, если все символы найдены, значит возвращаем результат, иначе переходим к следующей строке в списке.
 
насколько я понимаю 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
))) теперь я понимаю почему так!
Вы поиском то не пользуетесь вообще? Тему поднимали мильон500 раз уже!
Это не точный поиск, отсюда все проблемы, поиск по совпадению хотябы одного символа идет!
чтобы все было нормально делаем так!
Код:
Развернуть Свернуть Копировать
это
if (str.Contains(textContains))
заменить на это
if (str==textContains)
Не забудьте записать, а то завтра забудете!
В твоем случае идет сравнение строк посимвольно.
Если количество символов разное в строках, соответственно результат будет не верный.
 
В твоем случае идет сравнение строк посимвольно.
Если количество символов разное в строках, соответственно результат будет не верный.
главное отрабатывает правильно!
Если в переменно "1" а в списке "текст 1" "текст 123" - то это не будет "ок"
 
главное отрабатывает правильно!
Если в переменно "1" а в списке "текст 1" "текст 123" - то это не будет "ок"
ему нужно, чтобы, например, "текст13" находился при поиске в строке "текст123"
 
ему нужно, чтобы, например, "текст13" находился при поиске в строке "текст123"
воЁ! Заняться то ему больше нечем, искать то чего нет!
Регулярочку в зубы и погнал, раз такой изощренный!
 
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";
 
Добавил пару строк в ваш код:
Код:
Развернуть Свернуть Копировать
            // берем из переменной текст, который надо искать
            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";
        }
 
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
Добавил пару строк в ваш код:
Код:
Развернуть Свернуть Копировать
            // берем из переменной текст, который надо искать
            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
а з-ачем, если все символы есть выйдет по yes если нет то no
Такой алгоритм не идеален, даже наоборот, но более похож под суть задачи, хотя если еще предусмотреть порядок символов и количество вхождений.
 
  • Оценить
Реакции: jasblack
даже вот так

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
Слово ГУРУ в названии топика творит чудеса, я насчитал несколько кодеров, что вцепились в тему, может из за того, что сейчас ночь :D
Под покровом ночи эти создания пишут код :D
 
  • Оценить
Реакции: masterLomaster
у меня 9.20 утра покрайней мере
 

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