0

次のスキームのコレクションに特定の文字列値があるかどうかを確認するにはどうすればよいですか? 同様の例をいくつか読んだことがありますが、実際には何も役に立ちません。どうもありがとう、

必要なものの例

    foreach(var item in data.Valuations)
    {
        if(item.Schemes.Contains("my string")) {
           // Do something 
        }
    }

コード

    public Valuation[] Valuations { get; set; }

    public IEnumerable<string> Schemes
    {
        get { return this.Values.Keys; }
    }

    public Dictionary<string, Dictionary<string, double>> Values { get; internal set; }

アップデート

次のコード行を使用してそれを行うことができました。

    var model = new DetailViewModel 
    {
        model.Data = ...
    }

    // New bit

    model.Data.SelectMany(x => x.Schemes).Where(x => x == "my string");

ただし、model.Data を見ると、フィルタが適用されていません。私は愚かな何かを逃していますか?「私の文字列」はスキームにあります

4

3 に答える 3

3

これを行う最も効率的な方法は、ディクショナリ クラスContainsKeyのメソッドを使用することです。

if (Values.ContainsKey("my string")) 
{

}

IEnumerable<String> Schemesプロパティを本当に操作したい場合は、それがusing System.Linqコードの先頭にあることを確認するだけで、.Containsが質問とまったく同じように機能します。

于 2013-09-17T12:33:54.867 に答える
1

でlinqを試してくださいSelectMany

if(Values.SelectMany(x => x.Value.Keys).Any(x => x == "my string"))
{
   //do your stuff here
}

これにより、内部辞書からすべてのキーのコレクションが作成されます。この例では、後続のクエリで検索できますAny。文字列が見つかった場合は true を返します。

于 2013-09-17T12:33:04.167 に答える
0

次のような意味ですか。

    if(schemes.Any(x=>x=="my string")) 
    {
       // Do something
    }

LINQから使用Anyして、述語に一致する要素があるかどうかを確認できます->ここでは、「私の文字列」に等しい文字列があるかどうかを確認します。

他の解決策が次のContains場合にのみ使用できます。Lists

public List<string> Schemes
{
    get { return this.Values.Keys.ToList(); }
}

public Dictionary<string, Dictionary<string, double>> Values { get; internal set; }

その後

if(schemes.Contains("my string")) 
{
   // Do something
}

有効になります。

しかし、リストではなくLinqを使用することをお勧めしContainsます。

于 2013-09-17T12:32:33.990 に答える