none
Поиск в словаре по ключу и compare RRS feed

  • Вопрос

  • Ну вроде в теме описал, есть словарь, ключи и значения это пути к файлам

    if(FileList.ContainsValue(@"C:\Program Files\WinPost\WinPost.exe"))
    

    не возвращает правды, нужно использовать Compare, я думаю, но у Dictionary нет такого определения с Compare.

    Как можно обойти этот момент, я надеюсь можно как то справится без переопределения Contains.

    • Перемещено Abolmasov Dmitry 7 сентября 2011 г. 12:40 (От:Настольные ПК)
    5 августа 2011 г. 7:05

Ответы

  • Да, про такое я в курсе, вобще то я уже обошёл так:

    List<string> ListForChekList = new List<string> { };
          ListForChekList.AddRange(FileList.Values);
          
          if(ListForChekList.Contains(@"C:\Program Files\Winpost\Winpost.exe",StringComparer.OrdinalIgnoreCase))
    


    Фигово конечно, но просто.

    Не хотелось бы закрывать эту тему, потому что я уже не в первый раз сталкиваюсь, с проблемой сравнения простых string со стрингами которые получились из имён и путей файлов. Так что я продолжаю ждать ответов в этом топике

    • Помечено в качестве ответа Abolmasov Dmitry 11 августа 2011 г. 6:45
    5 августа 2011 г. 10:40
  • Не понимаю, почему нельзя просто передать Comparer. Работает же:

          var fileList = new Dictionary<string, string>() { { "key", "value" } };
          Console.WriteLine(
            fileList.Values.Contains("VaLuE", StringComparer.OrdinalIgnoreCase)
            );
    
    



    My blog | My Favorite Project
    • Помечено в качестве ответа Abolmasov Dmitry 11 августа 2011 г. 6:45
    5 августа 2011 г. 17:13
    Модератор

Все ответы

  • Какого типа ключи и значения в Dictionary ?

    Приведите пример заполнения Dictionary.

    5 августа 2011 г. 7:46
    Отвечающий
  • ContainsValue возвращает bool. Что вы имеете ввиду, когда пишете "не возвращает правды"?
     
    Поиск по ключу - ContainsKey.
     
    5 августа 2011 г. 7:57
    Модератор
  • Вот так он заполняется, ключ и значение - пути к файлам

    Regex regex = new Regex(".lnk$");

     

     try
    
                {
    
                    foreach(var file in Directory.GetFiles(@"C:\users\" + Lname[1] + @"\desktop"))
    
                    {
    
                        if (regex.IsMatch(file))
    
                        {
    
                            IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.WshShortcut)shell.CreateShortcut(
    
                                file);
    
                            FileList.Add(file, shortcut.TargetPath);
    }}}
    

     

    5 августа 2011 г. 9:34
  • Не понимаю, чего тут может быть не понятного условие if(FileList.ContainsValue(@"C:\Program Files\WinPost\WinPost.exe")) не срабатывает

    И мне нужен поиск по value - ContainsValue, я не понимаю с чем это связано, но при использование Compare к List<string>, contains срабатывал, но листа мне не хватало, перешёл к словарю, ни у ContainsKey ни у ContainsValue нет возможности прибегнуть к Compare

    5 августа 2011 г. 9:37
  • Может FileList не содержит этого пути?

     

     

    5 августа 2011 г. 10:01
    Модератор
  • Не содержал бы, не было бы вопросов, вот то значение на котором должно сработать

    {[C:\users\glonas2\desktop\WinPost - Ярлык.lnk, C:\Program Files\Winpost\WinPost.exe]}

    напомню, что я ищу вот так 

    if(FileList.ContainsValue(@"C:\Program Files\WinPost\WinPost.exe")
    

    5 августа 2011 г. 10:12
  • У вас пути разные реальный и тот который вы ищите:

    реальный - C:\Program Files\Winpost\WinPost.exe

    ищите -      C:\Program Files\WinPost\WinPost.exe


    Для связи [mail]
    5 августа 2011 г. 10:25
  • Вот код:

          Dictionary<string, string> FileList = new Dictionary<string, string>();
          FileList.Add(@"C:\users\glonas2\desktop\WinPost - Ярлык.lnk", @"C:\Program Files\Winpost\WinPost.exe");
          if (FileList.ContainsValue(@"C:\Program Files\Winpost\WinPost.exe"))
          {
            Console.WriteLine("Есть!!!");
          }
    


    Он отрабатывает правильно и все находит. 

     

    5 августа 2011 г. 10:26
    Модератор
  • Нет, изменение регистра(конечно же) ничего не изменило
    • Изменено starostin 5 августа 2011 г. 10:54
    5 августа 2011 г. 10:32
  • Наверное не рееста, а регистра. Точно нигде не ошиблись?

    Тогда возьмите выведите в текстбокс значение пути по ключу, скопируйте из текскбокса и вставьте в программу в условие поиска.


    Для связи [mail]
    5 августа 2011 г. 10:39
  • Да, про такое я в курсе, вобще то я уже обошёл так:

    List<string> ListForChekList = new List<string> { };
          ListForChekList.AddRange(FileList.Values);
          
          if(ListForChekList.Contains(@"C:\Program Files\Winpost\Winpost.exe",StringComparer.OrdinalIgnoreCase))
    


    Фигово конечно, но просто.

    Не хотелось бы закрывать эту тему, потому что я уже не в первый раз сталкиваюсь, с проблемой сравнения простых string со стрингами которые получились из имён и путей файлов. Так что я продолжаю ждать ответов в этом топике

    • Помечено в качестве ответа Abolmasov Dmitry 11 августа 2011 г. 6:45
    5 августа 2011 г. 10:40
  • хм, вы были в чём то правы, я просто при дэбаге взял значение получаемое из Directory.GetFiles и вставил его в условие, я не сколько раз проверил, и даже попросил ближайшего человека перепроверить, строки абсолютно одинаковы, начинаю беспокоится, что это различия в кодировке (в которой набираю код и в которой получает Directory.GetFiles, наверно это из за того что у меня преславутая русская версия)
    5 августа 2011 г. 11:07
  • Можете попробовать установить значение культуры в Invarian (может поможет)

    System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
    

    Также попробуйте сохранять данные, приводя их в нижний регистр shortcut.TargetPath.ToLower() или shortcut.TargetPath.ToLowerInvariant(), а потом при поиске, также привести @"C:\Program Files\Winpost\WinPost.exe".ToLower()

    Регистр в путях не критичек, поэтому такой вариант, если он будет работать - может подойти.


    Для связи [mail]
    5 августа 2011 г. 11:19
  • Не понимаю, почему нельзя просто передать Comparer. Работает же:

          var fileList = new Dictionary<string, string>() { { "key", "value" } };
          Console.WriteLine(
            fileList.Values.Contains("VaLuE", StringComparer.OrdinalIgnoreCase)
            );
    
    



    My blog | My Favorite Project
    • Помечено в качестве ответа Abolmasov Dmitry 11 августа 2011 г. 6:45
    5 августа 2011 г. 17:13
    Модератор
  • почему то не срабатывает
    8 августа 2011 г. 7:25
  • У вас работает код PashaPash (именно его пример)? Ваш вариант с копированием в List и последующий вызов Contains ничем не отличается от варианта PashaPash.

    У вас не работает поиск значения только на одном примере?

    Какая у вас выводится культура при вызове

    System.Threading.Thread.CurrentThread.CurrentCulture

    Для связи [mail]
    8 августа 2011 г. 12:40
  • Как именно не срабатывает? Выводит False?
    My blog | My Favorite Project
    9 августа 2011 г. 12:45
    Модератор
  • > но у Dictionary нет такого определения с Compare.

    какая версия .net? в 4.0 есть System.Collections.Generic.Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)

    12 августа 2011 г. 18:33
  • Это comparer для ключей. Топикастер хотел указать comparer для значений.
    My blog | My Favorite Project
    13 августа 2011 г. 4:32
    Модератор