2015-07-09 4 views
-1

Я пытаюсь изучить и практиковать принципы ООП, и мне нужна помощь, чтобы привести меня к горбу. У меня есть следующий код:Консолидация аналогичных методов в один метод для уменьшения дублирования

using System.Collections.Generic; 
namespace Test 
{ 
    class Program 
    { 
     static void Main() 
     { 
      Dictionary<string, string> dictionary = new Dictionary<string, string>(); 

      dictionary.Add("cat", "one"); 
      dictionary.Add("dog", "two"); 
      dictionary.Add("llama", "three"); 
      dictionary.Add("iguana", "four"); 

      var test1 = GetKVP(dictionary, "llama"); 
      var test2 = GetValue(dictionary, "llama"); 
      var test3 = GetPosition(dictionary, "llama"); 
     } 

     static KeyValuePair<string, string> GetKVP(Dictionary<string, string> dict, string key_to_find) 
     { 
      foreach (KeyValuePair<string, string> kvp in dict) 
      { 
       if (kvp.Key == key_to_find) 
       {return kvp;} 
      } 
      return new KeyValuePair<string, string>(); 
     } 

     static string GetValue(Dictionary<string, string> dict, string key_to_find) 
     { 
      foreach (KeyValuePair<string, string> kvp in dict) 
      { 
       if (kvp.Key == key_to_find) 
       {return kvp.Value;} 
      } 
      return string.Empty; 
     } 

     static int GetPosition(Dictionary<string, string> dict, string key_to_find) 
     { 
      int counter = 0; 
      foreach (KeyValuePair<string, string> kvp in dict) 
      { 
       if (kvp.Key == key_to_find) 
       {return counter;} 
       counter += 1; 
      } 
      return -1; 
     } 
    } 
} 

То, что я пытаюсь сделать, это закрепить кодовый так, что я могу иметь один метод, который возвращает другой тип данных без дублирования кода. Пожалуйста, не комментируйте тот факт, что есть несколько более эффективных способов поиска словаря, я знаю, что это не идеально. Я просто издевался над некоторыми данными и методами, которые можно использовать в качестве примера. Для жизни я не могу представить, как реализовать что-то подобное.

+1

Словари не упорядочены, поэтому GetPosition не будет возвращать последовательные результаты, за исключением совпадения. – Bringer128

+0

Это просто пример «Пожалуйста, не комментируйте тот факт, что есть несколько более эффективных способов поиска словаря, я знаю, что это не идеально. Я просто издевался над некоторыми данными и методами, которые можно использовать в качестве примера . ".. Мне все равно, что он возвращает, мне просто нужен метод, который что-то возвращает. – stumped221

+0

Этот код для меня не имеет никакого смысла. В дополнение к точке в предыдущем комментарии ('GetPosition()' - бессмысленный метод), в чем смысл 'GetKVP()'? Когда всегда полезно иметь пустой экземпляр «KeyValuePair» (даже если вы исправили код, чтобы он компилировался ... для этого типа нет конструктора без параметров). Что вы на самом деле пытаетесь консолидировать здесь? Вы просто хотите сделать этот код _generic_? –

ответ

-1

В .net Everthing основан на объекте, так просто возвращает объект, а затем объект может быть что угодно, как вам хочу

вот пример основан на коде

using System.Collections.Generic; 
namespace Test 
{ 
    class Program 
    { 
     static void Main() 
     { 
      Dictionary<string, Object> dictionary = new Dictionary<string, string>(); 

      dictionary.Add("cat", "one"); 
      dictionary.Add("dog", "two"); 
      dictionary.Add("llama", "three"); 
      dictionary.Add("iguana", "four"); 

      var test1 = GetWhatEver(dictionary, "llama"); 
      var test2 = GetWhatEver(dictionary, "llama"); 
      var test3 = GetWhatEver(dictionary, "llama"); 
     } 

     static Object GetWhatEver(Dictionary<string, Object> dict, string key_to_find) 
     { 
      foreach (var kvp in dict) 
      { 
       if (kvp.Key == key_to_find) 
       {return kvp.Value;} 
      } 
      return null; 
     } 

    } 
} 
+0

Я думаю, что это то, что я представлял. но как я могу указать методу, что он должен вернуть? Например, скажем, я хочу, чтобы объект был строкой. Должен ли я просто добавить параметр, чтобы указать это? – stumped221

+0

вы можете добавить что-нибудь в словарь, а затем он вернет вещь, которую вы добавили, правильно использовать возвращенный объект до конца вашего кода. – Thorarins

+0

Извините .. я имею в виду .. в некоторых случаях я хочу для поиска и получения всего kvp, но в некоторых случаях я хочу, чтобы он возвращал мне строку и т. д. – stumped221

0

Вы могли бы попытаться сделать это, но я не думаю, что это помогает слишком много:

static R GetResult<R>(Dictionary<string, string> dict, string key_to_find, Func<KeyValuePair<string, string>, R> selector, R otherwise) 
{ 
    return dict.Where(kvp => kvp.Key == key_to_find).Select(kvp => selector(kvp)).DefaultIfEmpty(otherwise).First(); 
} 

static KeyValuePair<string, string> GetKVP(Dictionary<string, string> dict, string key_to_find) 
{ 
    return GetResult(dict, key_to_find, kvp => kvp, new KeyValuePair<string, string>()); 
} 

static string GetValue(Dictionary<string, string> dict, string key_to_find) 
{ 
    return GetResult(dict, key_to_find, kvp => kvp.Value, String.Empty); 
} 

static int GetPosition(Dictionary<string, string> dict, string key_to_find) 
{ 
    return dict.Where(kvp => kvp.Key == key_to_find).Select((kvp, n) => n).DefaultIfEmpty(-1).First(); 
}