2017-10-12 39 views
2

私はNameValueCollectionの変数queryDictを持っています。値なしのNameValueCollectionキー

一部のキーには値がありません。しかし、私はそれらに値が関連付けられていない場合でも、すべてのキーを通過したいと思います。値が空の場合は、これを使用して

は、私の代わりにキー名のヌル取得:

foreach (var parameter in queryDict) 
{ 
    key = (string)parameter; 
} 

AllKeysは、すべての結果を生み出します。

しかし、私はnullも得ます。 queryDictの内容を見ると、文字列に値があることがわかります...

アルゴリズムを作成することなく、どのようにしてすべてのキー名にアクセスできますか?

添加:= 1つの& CID

{AQB = 1つの& NDH:ここ

マウスでホバリングのQueryDictの内容です。 & oxygenid}

cid。

string queryString = "AQB=1&ndh=1&cid.&oxygenid"; 
NameValueCollection queryDict = System.Web.HttpUtility.ParseQueryString(queryString); 
+0

A NameValueCollectionのは、あなたが同じキーで複数の値を追加することができますが、あなたはNULL値を持つキーを追加した場合の取得

coll.Add("This", null); coll.Add("That", "A value"); // coll.Add("This", "Not a null"); 

を追加し、その後、同じ値を返すことができます。最初の値は利用できません。 – Steve

答えて

3

NameValueCollectionを使用すると、同じキーで複数の値を追加できますが、null値のキーを追加してからnull以外の値を持つ同じキーを再度読み取った場合、最初の値(null値)のは、いくつかのシナリオをテストしてみましょう

使用可能なより多くのです。だから、オブジェクトが2の値をマージしました

NameValueCollection coll = new NameValueCollection(); 
coll.Add("This", "Test"); 
coll.Add("That", "A value"); 
coll.Add("This", "Not a null"); 

foreach (string p in coll.AllKeys) 
{ 
    Console.WriteLine("Key=" + p + ", Value=[" + (coll[p] ?? "null") + "]"); 
} 

我々は出力として、取得、

Key=This, Value=[Test,Not a null] 
Key=That, Value=[A value] 

罪に追加しません2つの値をカンマで区切って入力します。 今度は

coll.Add("This", null); 
coll.Add("That", "A value"); 
coll.Add("This", "Not a null"); 

で出力が最初のアドオンの痕跡はありません

Key=This, Value=[Not a null] 
Key=That, Value=[A value] 

で試してみましょう。なぜこれが起こるのですか?単に値をマージするAddメソッドの内部ロジックでは、nullの初期値と最初のaddで追加されたnullを区別できないためです。したがって、null値を "Not a null"文字列に置き換えるだけです。実際、最後のコメント

たちは

Key=This, Value=[null] 
Key=That, Value=[A value] 
+0

この説明に感謝します。私はこのコードを試して、あなたは正しいです。それはそれが私がそれを埋める方法(私は私のポストに加えて)のためにあるようだ。値を持たないパラメータは無視されないようにParseQueryStringを使う方法はありますか? – Cher

+0

まあ、ParseQueryStringは、空の文字列( "")としてnull値ではなく、値のないパラメータを扱います。したがって、値がない場合は空の文字列を持つキーを返します。しかし、あなたのサンプル入力は無効です。 ParseQueryStringで正しく動作させるには、 "AQB = 1&ndh = 1&cid =&oxygenid ="; _ – Steve

+0

が必要です。 _ "AQB = 1&ndh = 1&cid。&oxygenid" _という文字列をParseQueryStringに渡すと、2つの文字列 "cid"を持つコレクション "null"の3番目のキーが取得されます。と "oxygenid"。これは、ParseQueryStringがキーを判別できず、入力をヌルキーの値として使用できないことを示しているようです。 – Steve

0

I would like to go through all keysあなたはその後、キーをループする必要があります:

foreach (var parameter in queryDict.Keys) 
+0

私がやったことは同じです。私はまだパラメータを持たないキーを取得しません – Cher

0

これを試してみて、それが動作するかどうかを確認し、ループ

にoxygenid見つからない私はそれをこのように満たされました。 NameValueCollection.AllKeysを使用してキーをループすることはできますが、重複は返されません。

foreach (var parameter in queryDict.AllKeys) { key = parameter; } 
+0

値がnullのキーも返しません。それは私のことと同じです。 – Cher

+0

オブジェクトに 'ヌルキー 'があるかもしれません。 'NameValueCollection'は複製/ヌルキーを許可します。さもなければ、これは機能するはずです。 – Anonymous

+0

キーはnullではありません。私はqueryDict – Cher

0

使用??ヌル合体オペレータオペランドがヌルでない場合は、左側のオペランドを返します。それ以外の場合は、右側のオペランドを返します。

+0

感謝の内容を分で追加します!私はコードでこれをどこに書くのですか? – Cher

関連する問題