2016-08-24 90 views
-1

我創建了一本字典(Dictionary<string, bool> values)。更改字典C的值#

我創建函數:

private Dictionary<string, bool> ChangeValues(int line, Dictionary<string, bool> values) 
    { 
     for (int i = 0; i < line; i++) 
     { 

     } 

     return values; 
    } 

我想根據線的數量來改變布爾值。

下表是一個辭典的結果(只顯示布爾):

line 0 = values["A"][false] 
      values["B"][false] 
      values["C"][false] 

line 1 = values["A"][false] 
      values["B"][false] 
      values["C"][true] 

line 2 = values["A"][false] 
      values["B"][true] 
      values["C"][false] 

line n... 

如何變更,根據線的數量bool值?

感謝。

[更新]

一些幫助後,函數完成:

private Dictionary<string, bool> ChangeValues(int line, Dictionary<string, bool> values) 
    { 
     string[] keys = values.Keys.ToArray(); 

     keys = (from k in keys orderby k descending select k).ToArray(); 

     for (int i = 0; i < line; i++) 
     { 
      for (int j = 0, bit = 1; j < values.Count; j++, bit <<= 1) 
      { 
       values[keys[j]] = (i & bit) != 0; 
      } 
     } 

     return values; 
    } 

由於PeterDuniho

+1

您能否提供樣本輸入和期望的輸出?目前的產量是多少? –

+0

@FirstStep如果行是0,所有的布爾值將是false,如果行是1,則最後一行將是true,如果行是2,則最後一行將是true ...也許等於二進制邏輯?我不知道... – jsfelipearaujo

+0

你是什麼意思「_line是0_」?你的意思是'=「0」'或什麼? –

回答

0

如果我正確地理解了這個問題,所有你想要的是能夠迭代存儲在你的字典中的所有可能的組合標誌。另外,這些標誌與您的循環變量i中的位完全對應。

如果是這樣,那麼您可以直接使用循環變量中的位來設置字典中的標誌值。對於一個通用的解決方案,您還需要傳遞密鑰名稱,並根據要設置的位以正確的順序傳遞密鑰名稱。

例如:

private Dictionary<string, bool> ChangeValues(int line, Dictionary<string, bool> values, string[] keys) 
{ 
    for (int i = 0; i < line; i++) 
    { 
     for (int j = 0, bit = 1; j < keys.Length; j++, bit <<= 1) 
     { 
      values[keys[j]] = (i & bit) != 0; 
     } 

     // do something with values here 
    } 

    return values; 
} 

呼叫這樣的:

var result = ChangeValues(8, values, new [] { "C", "B", "A" }); 

注意上面的簡單的修改中傳遞我從有人問—的方式推斷字典「我想更改布爾值「 —這是你的意圖。但是,如果你真的想回到一個全新的字典對象,你可以這樣做:

private Dictionary<string, bool> ChangeValues(int line, string[] keys) 
{ 
    Dictionary<string, bool> values = new Dictionary<string, bool>(); 

    for (int i = 0; i < line; i++) 
    { 
     for (int j = 0, bit = 1; j < keys.Length; j++, bit <<= 1) 
     { 
      values[keys[j]] = (i & bit) != 0; 
     } 

     // do something with values here 
    } 

    return values; 
} 

當然,在這種情況下,原來的字典的值都是沒有用的,所以沒有必要將它傳遞in,所以我把它從這個版本的方法的參數列表中刪除了。

如果實際上你想返回一個新的字典,但由於某種原因仍然需要舊字典(例如,你想對它做些什麼,比如複製值或其他你沒有提到的問題),那麼你可以結合上面的兩個例子來滿足你的需求。

+0

很難知道提問者想要什麼,但在我看來,你的代碼一遍又一遍地覆蓋'Dictionary <,>'中的相同條目?我錯了嗎? –

+0

@傑普:你是對的;這就是我解釋這個問題的方式,它的內容是_「我想改變布爾值」_,而不是_「我想設置布爾值」_。如果OP願意的話,在方法中創建一個新的字典會很容易;但是我不可能知道他們是否想要這樣做,或者只是將該方法編寫成一種「僞流利」語法(即返回傳入的字典)。 –

+0

因此,當您的調用示例爲'ChangeValues(8,values,new [] {「C」,「B」,「A」})',當外循環變量'i'爲'0'時,'Dictionary <,> .Values'是FFF(三個'false'),那麼當'i'已經是'1'時,所有這些都被覆蓋,並且我們沒有FFT。最後,它就像我們只有外循環變量'i'的___last___迭代一樣。所以我們總是以二進制形式對應'line - 1'。 –

0

你的意思是這樣的:

static Dictionary<string, bool> ChangeValues(int line, Dictionary<string, bool> values) 
{ 
    switch (line) 
    { 
    case 0: 
     values["A"] = false; 
     values["B"] = false; 
     values["C"] = false; 
     break; 

    case 1: 
     values["A"] = false; 
     values["B"] = false; 
     values["C"] = true; 
     break; 

    case 2: 
     values["A"] = false; 
     values["B"] = true; 
     values["C"] = false; 
     break; 
    } 

    return values; 
} 

注:您也可以有void r eturn類型(如static void ChangeValues)並省略return values;語句,因爲總是返回相同的實例,但這取決於您是否需要「流暢語法」。


後評論,試試這個:

static Dictionary<string, bool> ChangeValues(int line, Dictionary<string, bool> values) 
{ 
    var binary = Convert.ToString(line, 2); 

    var key = 'A'; 
    foreach (var c in binary) 
    { 
    values[key.ToString()] = c == '1'; 
    key++; 
    } 

    return values; 
} 

註釋有關void是和以前一樣。

+0

這個想法是正確的,但如果字典有5個輸入(A,B,C,D和E)?輸入是變量。 – jsfelipearaujo

+0

@jsfelipearaujo你想要一個二進制表示? –

+0

我認爲是的,但我如何用變量字典做到這一點? – jsfelipearaujo