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

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

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

Добрый день.
Подскажите, а есть ли какой - то аналог команды like (как при работе с базами данных) в LINQ?
Зачем:
Есть коллекция allList<T>, в которой хранится много фигни разного типа, в том числе string. Так вот нужно по одному из string полей произвести поиск по маске (аля *.?xt или ???.bmp или *t и т.д.). Конечно, можно написать отдельную функцию, для определения, подходит ли строка поля по маске, но ведь удобнее было бы пользоваться чем - то вроде лайка)
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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...

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

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

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

13
139 / 137 / 21
Регистрация: 26.01.2010
Сообщений: 350
18.01.2012, 15:11 2
C#
1
2
3
var moo = from c in dc.Customers
          where c.Name.Contains("тров")
          select c;
Не забудь про регистр.
1
7 / 7 / 1
Регистрация: 22.03.2010
Сообщений: 84
18.01.2012, 15:19  [ТС] 3
Мм.. В поиске по маске подразумевается, что есть *, заменяющая сколько угодно символов и ?, заменяющий один символ. А эта функция будет всего лишь искать заданную последовательность символов в строке..
0
139 / 137 / 21
Регистрация: 26.01.2010
Сообщений: 350
18.01.2012, 15:37 4
Тогда
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
7 / 7 / 1
Регистрация: 22.03.2010
Сообщений: 84
18.01.2012, 15:38  [ТС] 5
ааа) Т.е. аналог звёздочки - это знак "%", а "?" он и есть "?", так?)
0
139 / 137 / 21
Регистрация: 26.01.2010
Сообщений: 350
18.01.2012, 15:39 6
Именно.
1
7 / 7 / 1
Регистрация: 22.03.2010
Сообщений: 84
18.01.2012, 15:43  [ТС] 7
Ооооу спасибище)) Это полностью решает мою проблему)
0
Эксперт .NET
15315 / 11609 / 3044
Регистрация: 17.09.2011
Сообщений: 19,432
18.01.2012, 16:30 8
C#
1
2
string pattern = "*.?txt";
var result = allList.Where(str => Regex.IsMatch(str, pattern));
2
7 / 7 / 1
Регистрация: 22.03.2010
Сообщений: 84
18.01.2012, 19:40  [ТС] 9
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
15315 / 11609 / 3044
Регистрация: 17.09.2011
Сообщений: 19,432
18.01.2012, 20:03 10
Цитата Сообщение от Leonidus Посмотреть сообщение
Regex - это что такое и где лежит?
Правым кликом по неопознанному классу - там будет менюшка Resolve. В ней находится список всех пространств из подключенных сборок, в которых имеется класс с данным именем. Тыкая по элементу списка, выбранное пространство либо добавится в using, либо в строчку, где оно не найдено.

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

Добавлено через 51 секунду
Цитата Сообщение от Leonidus Посмотреть сообщение
Суть в том, что пользователь вводит маску с клавиатуры, причём в удобоваримом формате "*" и "?". А эта команда весьма интересно обрабатывает.
Что именно интересно в регулярных выражениях?
1
7 / 7 / 1
Регистрация: 22.03.2010
Сообщений: 84
18.01.2012, 23:04  [ТС] 11
Заполним:
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
15315 / 11609 / 3044
Регистрация: 17.09.2011
Сообщений: 19,432
18.01.2012, 23:26 12
Цитата Сообщение от 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
7 / 7 / 1
Регистрация: 22.03.2010
Сообщений: 84
18.01.2012, 23:52  [ТС] 13
Ооо, так вон оно как) Блин, ну вот прям в точку) Проверил - работает) Не знал, что есть символы (сочетание) с аналогичными значениями) Супер!)

Добавлено через 15 минут
Экран нужно ставить первым, так ведь?
C#
1
masks.Add(parts[i].Replace(".", @"\.").Replace("?", ".").Replace("*", ".*"));
0
Эксперт .NET
15315 / 11609 / 3044
Регистрация: 17.09.2011
Сообщений: 19,432
18.01.2012, 23:56 14
Цитата Сообщение от Leonidus Посмотреть сообщение
Экран нужно ставить первым, так ведь?
Да, лучше сначала все что нужно заэкранировать, а потом заменять на паттерны. А то потом свои же замены можно заэкранить.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.01.2012, 23:56

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.