2011-03-19 55 views
1

我使用的字典在我的計劃是這樣使用對象

Dictionary<string, List<Term>> 

其期限是從類對象有兩個字段(姓名,身份證) 我需要添加新的對象爲字典,其中的新名稱對象未在字典中...... 如果新對象的字段名稱是存在的老對象的名字,我不會增加它.. 你能幫我 我使用的代碼是

foreach (string term in terms) 
    { 
     if (!dictionary.ContainsKey(term)) 
     { 
      dictionary.Add(term, new List<Term>()); 
     } 

     Term TT=new Term(i,name); 
     if (!dictionary[term].Contains(TT)) 
     { 
      dictionary[term].Add(TT); 


     } 

這段代碼呢sn't工作完全..

+0

什麼是「完全不工作」?你得到什麼錯誤或結果是什麼? – BoltClock 2011-03-19 21:43:41

+0

有什麼問題?你需要告訴我們什麼不起作用。 – ChrisF 2011-03-19 21:43:45

+0

什麼是「我」和「名字」?我沒有看到他們在任何地方宣佈。 – BoltClock 2011-03-19 21:47:29

回答

6

的問題是在這裏:

if (!dictionary[term].Contains(TT)) 
    { 
     dictionary[term].Add(TT); 
    } 

List.Contains如果類Term未實現IEquatable<Term>默認行爲是檢查引用相等。由於您剛構建的對象不能在列表中,所以Contains將始終返回false,並且總是會添加新的Term

一個好的解決方案是在Term中實施IEquatable<Term>並在IEquatable<Term>.Equals方法中指定您想要的相等的標準。

另一種解決方案(這可能是不太可取的,因爲它只會幫助的代碼來解決這個特殊片)是測試改爲

// Change the t.name == TT.name test to whatever your idea 
    // of "term X equals term Y" is 
    if (dictionary[term].FindIndex(t => t.name == TT.name) == -1) 
    { 
     dictionary[term].Add(TT); 
    } 
+0

,或者您可以將數據結構更改爲Dictionary >。列表的Contains操作在迭代所有項目時很慢。 – 2011-03-19 23:07:18

+0

@Can:請記住 - 不成熟的優化是所有邪惡的根源;) – ChrisWue 2011-03-20 02:06:58

+0

@ChrisWue當然,但我認爲在避免重複的地方使用字典而不是列表是有意義的,但這不完全是關於優化,只是爲了解決問題而使用正確的數據結構。 – 2011-03-20 09:04:32

1

我認爲一個長期目標是通過它的ID來標識。所以,你要麼需要實現IEquatable<Term>上一任類或尋找與正確的ID這樣的術語:

if (!dictionary[term].Any(x => x.Id == TT.id)) 
{ 
    dictionary[term].Add(TT); 
} 

注:任何一個LINQ的擴展方法,所以你需要添加using System.Linq;

-1
static void Main(string[] args) 
    { 
     //Database producten 

     Dictionary<string, double> producten = new Dictionary<string, double>(); 
     Console.WriteLine("Dit zijn de beschikbare producten"); 
     producten.Add("T-shirt", 45.35); 
     Console.WriteLine("T-shirt"); 
     producten.Add("trui", 25.50); 
     Console.WriteLine("trui"); 
     producten.Add("broek" , 90); 
     Console.WriteLine("broek"); 

     //Einde database 
     //Console.WriteLine(producten["trui"]); 

     double tot = 0; 
     bool boot = true; 
     Dictionary<string, int> winkelmandje = new Dictionary<string, int>(); 

     while (boot) 
     { 
      Console.WriteLine("Wilt u een product toevoegen?, ja of nee?"); 
      string answer = Console.ReadLine(); 
      if (answer == "ja") 
      { 
       Console.WriteLine("Geef de naam van het product?:"); 
       string naam = Console.ReadLine(); 

       Console.WriteLine("Hoeveel aantallen wenst u van dit product?:"); 
       int inthvl = Convert.ToInt32(Console.ReadLine()); 

       winkelmandje.Add(naam, inthvl); 

      } 

      if (answer == "nee") 
      { 
       foreach(KeyValuePair<string, int> product in winkelmandje) 
       { 
        if (producten.ContainsKey(product.Key)) 
        { 
         tot = tot + producten[product.Key] * product.Value; 
        } 
        else 
        { 
         Console.WriteLine("Dit product verkopen wij niet."); 
        } 
       } 
       boot = true; 
       Console.WriteLine("Gelieve " + tot + " euro te betalen."); 

      }