2017-02-20 41 views
1

Добрый день всем,сравнение идет неисправна C# Dictionary <String, String []>

У меня есть Dictionary<String, String[])>, с ключом => Пример значения, как следующее:

{ "Eten/drinken", new string[] { "canteen", "mcdonald's", "mimi" } } 

Мне нужно сравнить строка part с одним из значений словаря:

if (categories.Any(x => x.Value.Contains(part))) { 
     category = categories.FirstOrDefault(x => x.Value.Contains(part)).Key; 
} 

в одном сценарии part = "mcdonald's veghel veghel", что делает сравнение с значением словаря вернуться false.

Почему это неверно? "mcdonald's veghel veghel" действительно содержит mcdonald's, и сравнение нулевого пространства действительно идет так, как должно.

+1

Поскольку ни один из них не содержит '" Макдональдс veghel veghel "подстроки. – zerkms

+1

* Почему это ложь? * - ну, вы сравнили «вегвель veghel mcdonald» с '{« столовая »,« mcdonald's »,« mimi »}'. Если вы хотите сравнить, содержит ли значение какое-либо слово из переменной 'part', вам нужно разделить« veghel veghel »' mcdonald's '' на '{" mcdonald's "," veghel "}', а затем проверить, все ли они существуют в массиве словаря. –

+0

Забавно, это на самом деле то, что я делал раньше в своем коде, но думал, что это будет слишком коварно. Благодарю за то, что вы все поняли для меня! – MwBakker

ответ

2

На самом деле метод String.Contains будет проверять для любого заданного subsring, присутствующих в данной строке. к сожалению, нет x.Value, который содержит заданную строку, в то время как данные значения содержит элемент/с x.Value, так что вы должны изменить свой запрос, как следующее:

var collectionResult = categories.FirstOrDefault(x => x.Value.Any(s=> part.Contains(s))); 
if(collectionResult != null) 
{ 
    var selectedKey = collectionResult.Key; 
} 
+1

хорошая идея, это можно сделать таким образом, а не раскалывать часть. –

+0

Спасибо за это предложение и за быстроту этого ответа! – MwBakker

+1

@MwBakker: Нет упоминания, мы все здесь, чтобы помочь. Рад помочь вам приятель –

3

Выражение внутри лямбда x.Value.Contains(part) означает, что любой из элементов {"canteen", "mcdonald's", "mimi"} содержит строку "mcdonald's veghel veghel", которая является false. Вы хотели обратное условие, то есть, где длинная строка part содержит любое из ключевых слов из вашего списка:

categories.Any(x => x.Value.Any(s => part.Contains(s))) 
+0

@zerkms. Вы правы, должно быть другое 'Any'. – dasblinkenlight

+0

Спасибо! Быстрый ответ и отличное предложение – MwBakker

+1

Тем не менее он проверяет только на существование. Фактически op берет '.Key', соответствует элементу. Я думаю, вы должны сделать некоторые изменения, чтобы сделать его идеальным. спасибо –