2016-08-24 10 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値を変更するにはどうすればよいですか?

ありがとうございました。

[更新]

いくつかの助けた後、関数が実行されます:

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; 
} 

注:あなたはこのようPeterDuniho

+1

サンプル入力と希望する出力を提供してください。そして、現在の出力は何ですか? –

+0

@FirstStep行が0の場合、すべてのブール値はfalseになります。行が1の場合、最後の行は真です。行が2の場合は最後ですが、真の場合...おそらく2進論理と同じですか?私は知らない... – 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; 
} 

を、その場合には、元の辞書の値は役に立たないので、それを渡す必要はありませんこのバージョンのメソッドのパラメータリストから除外しました。

実際に新しい辞書を返すが、何らかの理由で古い辞書が必要な場合(たとえば、質問で言及しなかった値や何かをコピーするなど、何かをしたい場合)上記の2つの例を組み合わせてニーズに合わせることができます。

+0

質問者が何を望んでいるのか分かりにくいですが、あなたのコードが 'Dictionary <,> 'の同じ項目を何度も上書きするように見えますか?私が間違っている? –

+0

@Jeppe:あなたは正しいです。それは私が "私はブール値を設定したい"と反対の_ "私はブール値を変更したい" _という質問を解釈する方法です。彼らが望むならば、OPが新しい辞書を作成するのは簡単です。彼らがそれを望んでいるかどうかを知ることは不可能です。あるいは、メソッドを「擬似流暢な」構文の一種(つまり、渡された辞書を返す)として書き込んだだけです。 –

+0

あなたの呼び出しの例では、 'ChangeValues(8、values、new [] {" C "、" B "、" A "})'は、外部ループ変数 'i'が' 0'のとき、 'Dictionary FFF(3つの '偽')であり、 'i'が '1'であればそれらのすべてが上書きされ、FFTはない。結局、外部ループ変数 'i'の___last___回の繰り返ししかなかったようです。ですから、バイナリで 'line-1'に相当するもので結局終わります。 –

0

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; 
    } 

感謝を意味しますか:void r (static void ChangeValuesのような)eturn型で、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

関連する問題