web-dev-qa-db-ja.com

辞書コレクションでアイテムを見つける方法

次のコレクションを宣言してデータを追加しました。

_protected static Dictionary<string, string> _tags;
_

次に、コレクション内の特定のエントリを探します。私は次のことを試しました。

_thisTag = _tags.FirstOrDefault(t => t.Key == tag);
if (thisTag != default(KeyValuePair<string, string>))
    ...
_

そして、私はエラーを取得します:

演算子 '!='は、タイプ 'System.Collections.Generic.KeyValuePair'および ''のオペランドには適用できません

最初に、結果をnullと比較しようとしましたが、structsではサポートされていないと思います。

コレクション内でアイテムを見つけるのは非常に簡単な作業だと思っていたでしょう。では、探しているアイテムが見つかったかどうかを判断するにはどうすればよいでしょうか?

(注:高速検索が必要なため、Dictionaryを使用しています。Contains()を使用してアイテムが存在するかどうかを判断できることはわかっています。は、高速検索の目的を無効にします。アイテムをすばやく検索でき、成功したかどうかを判断する方法があれば、別のコレクションを喜んで使用します。)

34
Jonathan Wood
_thisTag = _tags.FirstOrDefault(t => t.Key == tag);
_

辞書のキーで何かを見つけるには非効率的で少し奇妙な方法です。キーを探すことは、辞書の基本的な機能です。

基本的な解決策は次のとおりです。

_if (_tags.Containskey(tag)) { string myValue = _tags[tag]; ... }
_

ただし、2回のルックアップが必要です。

TryGetValue(key, out value)はより簡潔で効率的で、1回の検索のみを行います。そして、それはあなたの質問の最後の部分に答えます、ルックアップを行う最良の方法は次のとおりです:

_string myValue;
if (_tags.TryGetValue(tag, out myValue)) { /* use myValue */ }
_

VS 2017更新、C#7以降では、結果変数をインラインで宣言できます。

_if (_tags.TryGetValue(tag, out string myValue))
{
    // use myValue;
}
// use myValue, still in scope, null if not found
_
92
Henk Holterman

別のテストを実行する必要がある場合は、FirstOrDefaultを使用する必要があります。辞書のKeyコンポーネントがnull可能であれば、これを行うことができます:

thisTag = _tags.FirstOrDefault(t => t.Key.SubString(1,1) == 'a');
if(thisTag.Key != null) { ... }

FirstOrDefaultを使用すると、一致が見つからない場合、返されるKeyValuePairのキーと値は両方ともnullになります。

7
igelineau

次のようにContainsKeyまたはTryGetValueを使用して、Dictionaryコレクションで要素を見つけることができます。

class Program
{
    protected static Dictionary<string, string> _tags = new Dictionary<string,string>();

    static void Main(string[] args)
    {
        string strValue;

        _tags.Add("101", "C#");
        _tags.Add("102", "ASP.NET");

        if (_tags.ContainsKey("101"))
        {
            strValue = _tags["101"];
            Console.WriteLine(strValue);
        }

        if (_tags.TryGetValue("101", out strValue))
        {
            Console.WriteLine(strValue);
        }
    }
}
0
BoiHue

もちろん、そこにあることを確認したい場合は失敗し、これは動作します:

thisTag = _tags [key];

注:キーと値のペアが存在しない場合、これは失敗しますが、場合によってはそれがまさに必要なものです。これにより、エラーをキャッチしてエラーについて何かを行うことができます。キーと値のペアがディクショナリ内にある、またはディクショナリ内にあることが確実な場合にのみ、これを行います。

0
Mac