2015-04-22 3 views
9

Лучший способ, что я могу объяснить, что я пытаюсь сделать, давая пример:Проверьте, если строка содержит определенные символы в любом порядке

У меня есть строка StackOverFlow в моей базе данных и когда пользователь OAW Я хотел бы вернуть эту строку и любое другое слово, содержащее эти три символа в любом порядке.

Я пробовал играть с различными выражениями LINQ/Lambda, но безрезультатно.

query.Where(a => a.SerialNumber.Contains(a)); 

Я нашел пост here on SO, который похож на мой, но это в Java.

Я чувствую, что то, что я пытаюсь сделать, чрезвычайно просто реализовать, но я просто пропустил его. Любая помощь будет оценена.

ответ

4

Вы могли бы попробовать что-то вроде этого:

query.Where(str => value.All(str.SerialNumber.Contains)); 

Здесь для любого слова в вашей базе данных, нужно проверить, если все символы value, OAW, -Используя All метод расширения - содержатся в str.SerialNumber.

Обновление

Это

str.SerialNumber.Contains 

эквивалентен это выражение лямбды:

x => str.SerialNumber.Contains(x) 

x относится к случайному элементу последовательности, в которой применит All. Другими словами, случайный характер value.

+0

Настолько расточительно назвать 'ToCharArray'. Строка уже 'IEnumerable ', поэтому вы можете сразу же LINQ на ней. Затем это превращается в решение Натана. –

+0

@JeppeStigNielsen вы совершенно правы. Спасибо за комментарий! – Christos

+0

@Christos Где вы получаете «а», чтобы вы могли сделать a.All()? – HiTech

1

Вы можете использовать функцию ContainsAll.

public static bool ContainsAllItems(IEnumerable<T> a, IEnumerable<T> b) 
{ 
    return !b.Except(a).Any(); 
} 

ПРИМЕЧАНИЕ

Функция была заимствована из here

+0

Используйте 'IEnumerable <>', а не 'List <>'. Строка представляет собой 'IEnumerable ', но не 'List <>'. –

+0

Хороший звонок, спасибо! –

+0

Я не уверен, как использовать этот метод. Еще немного new =/ – HiTech

0

Похоже, вы можете сделать несколько сравнений и & & или использовать регулярные выражения. Я предпочитаю первое, вот краткий пример:

arrOfCharacters.All(a.SerialNumber.Contains)

хотя вам может понадобиться засорять ваш код с ToUpperInvariant()

1

Вы можете сделать это, просто изменив код немного:

public bool DoesContain(char[] identifiers, string containingString) 
{ 
    return !identifiers.Except(containingString.ToCharArray()).Any(); 
} 

или:

private char[] identifiers = { /* Your identifiers*/ }; 

public bool DoesContain(string containingString) 
{ 
    return !identifiers.Except(containingString.ToCharArray()).Any(); 
} 

Любой из этих методов вернет true, если переданная строка содержит любой из указанных символов.

Примечание:

Решение от Cameron MacFarland на this question.

+0

Я просто попробовал это. Он возвращает true для любой строки, содержащей один из символов в массиве char. – HiTech

+0

Вы хотите, чтобы она содержала все символы? – CalebB

+0

Да. Я хотел бы, чтобы он возвращал true, если «containsString» имеет как минимум все «идентифицирует». Я отредактирую свой пост, чтобы сделать это более понятным. – HiTech

Смежные вопросы