Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/88: Рейтинг темы: голосов - 88, средняя оценка - 4.77
 Аватар для Leonidus
7 / 7 / 1
Регистрация: 22.03.2010
Сообщений: 84
.NET 4.x

Есть какой-то аналог команды like (как при работе с базами данных) в LINQ

18.01.2012, 14:59. Показов 16172. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Подскажите, а есть ли какой - то аналог команды like (как при работе с базами данных) в LINQ?
Зачем:
Есть коллекция allList<T>, в которой хранится много фигни разного типа, в том числе string. Так вот нужно по одному из string полей произвести поиск по маске (аля *.?xt или ???.bmp или *t и т.д.). Конечно, можно написать отдельную функцию, для определения, подходит ли строка поля по маске, но ведь удобнее было бы пользоваться чем - то вроде лайка)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.01.2012, 14:59
Ответы с готовыми решениями:

Есть запрос в SQL какой можно сделать аналог в LINQ
SELECT d.title, a.route_grp FROM route a JOIN schedule b ON a.schedule_id = b.id JOIN station c ON b.station_id = c.id JOIN...

Как создать выпадающий список при работе с базами данных Access
Выпадающий список при работе с Access Чтобы варианты(данные) в списке брались из другой соседней таблицы

Какие у C# Express есть ограничения по работе с базами данных
Добрый день! Подскажите пожалуйста, какие у Visual c# Express есть ограничения по работе с базами данных.

13
 Аватар для tasty_sock
139 / 137 / 21
Регистрация: 26.01.2010
Сообщений: 350
18.01.2012, 15:11
C#
1
2
3
var moo = from c in dc.Customers
          where c.Name.Contains("тров")
          select c;
Не забудь про регистр.
1
 Аватар для Leonidus
7 / 7 / 1
Регистрация: 22.03.2010
Сообщений: 84
18.01.2012, 15:19  [ТС]
Мм.. В поиске по маске подразумевается, что есть *, заменяющая сколько угодно символов и ?, заменяющий один символ. А эта функция будет всего лишь искать заданную последовательность символов в строке..
0
 Аватар для tasty_sock
139 / 137 / 21
Регистрация: 26.01.2010
Сообщений: 350
18.01.2012, 15:37
Тогда
C#
1
2
3
4
5
string pattern = "%ро?";
 
var moo = from c in dc.Customers
          where System.Linq.Data.SqlClient.SqlMethods.Like(c.Name, pattern)
          select c;
1
 Аватар для Leonidus
7 / 7 / 1
Регистрация: 22.03.2010
Сообщений: 84
18.01.2012, 15:38  [ТС]
ааа) Т.е. аналог звёздочки - это знак "%", а "?" он и есть "?", так?)
0
 Аватар для tasty_sock
139 / 137 / 21
Регистрация: 26.01.2010
Сообщений: 350
18.01.2012, 15:39
Именно.
1
 Аватар для Leonidus
7 / 7 / 1
Регистрация: 22.03.2010
Сообщений: 84
18.01.2012, 15:43  [ТС]
Ооооу спасибище)) Это полностью решает мою проблему)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
18.01.2012, 16:30
C#
1
2
string pattern = "*.?txt";
var result = allList.Where(str => Regex.IsMatch(str, pattern));
2
 Аватар для Leonidus
7 / 7 / 1
Регистрация: 22.03.2010
Сообщений: 84
18.01.2012, 19:40  [ТС]
Regex - это что такое и где лежит?
C#
1
2
3
4
5
6
7
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.IO;
using System.Data.SqlClient;
тут нет.
Даже как ключевое слово не распознаётся..

Добавлено через 1 минуту
Нашёл тут:
System.Text.RegularExpressions

Добавлено через 31 минуту
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.IO;
using System.Data.SqlClient;
using System.Text.RegularExpressions;
 
namespace Testing
{
          class Program
          {
                    static void Main(string[] args)
                    {
                              List<string> allLines = new List<string>();
                              allLines.Add("1.txt");
                              allLines.Add("11.txt");
                              allLines.Add("33333");
                              allLines.Add("44444");
                              allLines.Add("11122");
                              allLines.Add("22333");
                              allLines.Add("113");
                              allLines.Add("123");
                              string pattern = Console.ReadLine();
 
                              var result = from c in allLines
                                           where System.Data.Linq.SqlClient.SqlMethods.Like(c, pattern)
                                           select c;
                              foreach (string res in result)
                              Console.WriteLine(res);
                              Console.ReadKey();
                              
                    }
          }
}
Не работает. Как исправить?)

Добавлено через 41 минуту
kolorotur, этот метод мне не особо подошёл.. Суть в том, что пользователь вводит маску с клавиатуры, причём в удобоваримом формате "*" и "?". А эта команда весьма интересно обрабатывает.. Она ищет факт вхождения строки в строку.. Я почитал в FAQ про неё. Не могу ума дать.
tasty_sock, чуть выше я предлагаю полный код программы. В консоль нужно только ввести маску и она должна будет вывести всё подходящее. Идея классная, но будет ругаться на ошибку, что что - то там только для SQL.. Мб кто глянет и придумает, как адаптировать?)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
18.01.2012, 20:03
Цитата Сообщение от Leonidus Посмотреть сообщение
Regex - это что такое и где лежит?
Правым кликом по неопознанному классу - там будет менюшка Resolve. В ней находится список всех пространств из подключенных сборок, в которых имеется класс с данным именем. Тыкая по элементу списка, выбранное пространство либо добавится в using, либо в строчку, где оно не найдено.

Цитата Сообщение от Leonidus Посмотреть сообщение
Не работает. Как исправить?
Выложить сюда паттерн, вбитый в консоль.

Добавлено через 51 секунду
Цитата Сообщение от Leonidus Посмотреть сообщение
Суть в том, что пользователь вводит маску с клавиатуры, причём в удобоваримом формате "*" и "?". А эта команда весьма интересно обрабатывает.
Что именно интересно в регулярных выражениях?
1
 Аватар для Leonidus
7 / 7 / 1
Регистрация: 22.03.2010
Сообщений: 84
18.01.2012, 23:04  [ТС]
Заполним:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
          class Program
          {
                    static void Main(string[] args)
                    {
                              List<string> allLines = new List<string>();
                              allLines.Add("1.txt");
                              allLines.Add("2.txt");
                              allLines.Add("12.txt");
                              allLines.Add("44444");
                              allLines.Add("11122");
                              allLines.Add("22333");
                              allLines.Add("113");
                              allLines.Add("123");
                              string pattern = Console.ReadLine();
 
                              var result = allLines.Where(str => Regex.IsMatch(str, pattern));
                              foreach (string res in result)
                              Console.WriteLine(res);
                              Console.ReadKey();
                              
                    }
          }
}
Вводим:
?.txt
получим ошибку (а подходит 1.txt и 2.txt)

*t
опять ошибка, ему, видите ли, подавай что - то перед метасимволом (а подходит 1.txt, 2.txt 12.txt)

Вводим:
1??txt
Получим:
1.txt
2.txt
12.txt
А надо: 12.txt

Ведь суть - то в том, что в запросах "?" заменяет один любой символ, а "*" сколько угодно подряд идущих символов. И как вот это увязать с тем, как работает приведённая функция.. Вероятно, это как - то реально, но я ума не дам..

Добавлено через 3 минуты
А если использовать sql метод (предыдущий выложенный мной листинг, можно тупо вставить себе и проверить, он компилируется), то:
Не удается использовать метод "Boolean Like(System.String, System.String)" на клиенте; он предназначен только для преобразования в SQL.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
18.01.2012, 23:26
Цитата Сообщение от Leonidus Посмотреть сообщение
Ведь суть - то в том, что в запросах "?" заменяет один любой символ, а "*" сколько угодно подряд идущих символов.
Если пользователю удобней искать так, то введенный им паттерн можно подогнать под соответствующее ему регулярное выражение.
Итак, "?" - означает один символ, а "*" - сколько угодно любых символов.
Решение: считывать паттерн с консоли и заменять специальные символы на их аналоги в регулярных выражениях:

C#
1
2
3
4
5
string pattern = Console.ReadLine().Replace("*", ".*").Replace("?", ".");
var result = allLines.Where(str => Regex.IsMatch(str, pattern));
 foreach (string res in result)
 Console.WriteLine(res);
 Console.ReadKey();
Простенько и со вкусом. Потом можете свою таблицу особых символов дополнять как угодно, а в коде просто заменять эти символы на их аналоги в регулярках.
Если ожидается, что пользователь будет вводить символы, являющиеся особыми в регулярных выражениях (точка, например), то их можно тем же реплэйсом заэкранировать:
C#
1
pattern.Replace(".", @"\.");
1
 Аватар для Leonidus
7 / 7 / 1
Регистрация: 22.03.2010
Сообщений: 84
18.01.2012, 23:52  [ТС]
Ооо, так вон оно как) Блин, ну вот прям в точку) Проверил - работает) Не знал, что есть символы (сочетание) с аналогичными значениями) Супер!)

Добавлено через 15 минут
Экран нужно ставить первым, так ведь?
C#
1
masks.Add(parts[i].Replace(".", @"\.").Replace("?", ".").Replace("*", ".*"));
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
18.01.2012, 23:56
Цитата Сообщение от Leonidus Посмотреть сообщение
Экран нужно ставить первым, так ведь?
Да, лучше сначала все что нужно заэкранировать, а потом заменять на паттерны. А то потом свои же замены можно заэкранить.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.01.2012, 23:56
Помогаю со студенческими работами здесь

Глюк при работе с базами данных
Ситуация: В Delphi 6.0 создаётся приложение по работе с базами данных. Такой глюк: Обнаружено, что во время изменения данных во время...

Ошибки при работе с базами данных
Всем привет. Если к TSQLQuery применяю фильтр и потом прокручиваю отфильтрованный DBGrid, то выпадает ошибка: &quot;Could not find the...

Многостраничность при работе с базами данных в Delphi
Добрый день Работаю с Delphi 2007 CodeGear. Разрабатывается десктоп приложение под базы данных с СУБД MySQL 5.1. Никто не подскажет...

Файловые проблемы при работе с базами данных
При попытке скопировать рабочий файл mdb из temp-директории на постоянное место выдается Permission denied. А открыть файл прямо из...

Проблемы при запуске работе с базами данных
У меня при запуске выбивает такую ​​ошибку. javafx.fxml.FXMLLoader logException SEVERE: java.lang.NullPointerException ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru