2015-02-15 3 views
-2

У меня есть запрос Linq, который возвращает имена как:удалить строки из Linq запроса

Joe 
Joe (1) 
Joe Bloggs 
Joe (2) 
Joe Bloggs (1) 

Каков наилучший способ удаления записей Джо Bloggs из списка, чтобы мой результирующий набор будет - формат имя был дубликаты всегда будут (п), где п есть увеличивается количество для этого имени:

Joe 
Joe (1) 
Joe (2) 

Я использовал ниже, чтобы попытаться удалить элементы нужных мне

newResults = results.Distinct().ToList(); 

Однако, похоже, это приведет к удалению повторяющихся записей. Я надеялся использовать выражение регулярного выражения в запросе linq, чтобы найти любые записи, которые являются Joe, и любые записи, которые являются Joe (, но не уверены, что регулярное выражение является правильным способом реализации.

Я также подключен к Linq запроса, как показано ниже:

var searchName = "Joe"; 
var results = names.Where(name => name.Equals(searchName)).ToList(); 

снова возвращает только 1 запись - вы можете включать в себя регулярное выражение в .equals сказать найти имена, где имя равняется имя поиска или равно поисковому имени + пробел + (

+0

[* Что вы пробовали? *] (http://www.whathaveyoutried.com) –

+1

Добро пожаловать в переполнение стека! Похоже, вы хотите, чтобы мы написали вам код. Хотя многие пользователи готовы создавать код для кодера, терпящего бедствие, они обычно помогают только тогда, когда плакат уже попытался решить проблему самостоятельно. Хорошим способом продемонстрировать это усилие является включение кода, который вы написали до сих пор, пример ввода (если он есть), ожидаемый вывод и вывод, который вы фактически получаете (вывод консоли, трассировки стека, ошибки компилятора - все, что угодно применимо). Чем больше деталей вы предоставляете, тем больше ответов вы получите. –

+0

Обновлено с тем, что я пробовал - не думал, что есть какая-то причина включать это, поскольку он не работает, как мне было нужно. –

ответ

1

Вы можете Regex.IsMatch метод, чтобы получить только эти строки, начинающиеся с Joe с последующим дополнительным (1), (2) и т.д. строки:

var pattern = @"Joe(?=(\W?\(\d+\))|$)"; 
var results = names.Where(name => Regex.IsMatch(name, pattern)).ToList(); 

Основываясь на входе образца вы предоставили results будет {"Joe", "Joe (1)", "Joe (2)"}.

+0

Значение «Joe» будет динамическим - может быть, например, Fred - я буду иметь его в переменной с именем personName - могу ли я добавить этот varaible к вашему шаблону в string.Format? –

+0

подключен к этой строке.Format - работает красиво - спасибо –

+0

можете ли вы разбить фигуры в Regex, чтобы объяснить, что каждый делает?У меня есть еще одно требование найти полное слово, поэтому, если у меня есть «Имя 1» и «Тест 1», а «1» - приведенное выше выражение будет возвращать 3 результата, если я перейду в «1», но я бы хотел, чтобы он просто возвращался один результат - могу ли я использовать^в вашем регулярном выражении, чтобы сделать это? –

0

Вам необходимо усовершенствовать свой запрос, чтобы возвращать только те данные, которые вы хотите. Если это невозможно, вы должны применить следующий запрос к полученной коллекции, попробуйте использовать структуру цикла для удаления нежелательных записей путем сравнения каждого элемента в коллекции и последующего ответа на совпадения с нужным кодом.

0

Если я вас правильно понял, вы хотите, чтобы исключить записи, который содержит "Bloggs" слово, так что ...

List<string> joes = new List<string>{"Joe", "Joe (1)", "Joe Bloggs", "Joe (2)", "Joe Bloggs (1)"}; 

var qry = joes.Where(j=>!j.Contains("Bloggs")); 

результат:

Joe 
Joe (1) 
Joe (2) 
Смежные вопросы