2009-07-23 8 views
1

は、まず以下の構造を見てみましょう(私はちょうど私が欲しいクエリの種類を示すために、それを簡素化しようとしています)シングルLINQクエリ:辞書です。<int型、辞書です<str, _class>>

class NameAddress 
    {  
     public string Name { get; set; } 
     public string Address { get; set; } 
     public NameAddress(string sName, string sAddress) { Name = sName; Address = sAddress; }  
    } 

    static void Main(string[] args) 
    { 
     Dictionary<int, Dictionary<string, NameAddress>> _dictionary = new Dictionary<int,Dictionary<string,NameAddress>>() 
      { 
      {/*int Key=*/1, /*Dictionary<str, NameAddress> value(1)=*/new Dictionary<string, NameAddress>() { {"First", new NameAddress("John Doe", "Mexico")}} }, 
      {/*int Key=*/2, /*Dictionary<str, NameAddress> value(2)=*/new Dictionary<string, NameAddress>() { {"Second", new NameAddress("Morris", "Washington")}, { "Third", new NameAddress("Keith", "New York")}} } 
      };  
    } 

I 1つのlinqクエリを使用して次のデータ構造を照会します。 私はニューヨークに住んでいる人と彼のキーを探したいとしましょう。整数キー(_辞書キー)はそれほど重要ではありませんが、文字列Key(この場合は "Third")がわかります。

文字列Keyと特定のNameAddressを1つのlinqクエリで見つけることはできますか?はいの場合、そのクエリは何ですか?

答えて

1

注:

var found = (from outer in _dictionary 
       from inner in outer.Value 
       where inner.Value.Address == "New York" 
       select new { 
        OuterKey = outer.Key, 
        InnerKey = inner.Key, 
        NameAddress = inner.Value 
       }).FirstOrDefault(); 
+0

私はこのようなものしか探していませんでした。ネストされたクエリを実行する方法を知らなかった。ありがとう –

+0

私はまだ私がクリーナー笑だと思う;) –

1

これは、この操作をサポートするための効率的なデータ構造ではありません。一般的な操作の場合は、新しいデザインを検討する必要があります。

培養条件を確認してください。 (むしろインデックスを使用するよりも)辞書を超えるこの反復するは、それが動作することを

string address = "New York"; 
KeyValuePair<string, NameAddress> result = 
    _dictionary.Values 
       .SelectMany(value => value) 
       .FirstOrDefault(pair => pair.Value.Address.Equals(address, StringComparison.CurrentCultureIgnoreCase)); 
+0

は、私は同意、それは効率的ではありません。私はいくつかの逆引き参照を(楽しいために)しようとしていました。したがって、ここで好奇心から尋ねられた。 –

関連する問題