2017-10-23 5 views
4

こんにちは前に、匿名型の値を取得するC#7C#ToDictionaryは、ここではC#7

static void Main(string[] args) 
    { 
     List<User> userlist = new List<User>(); 
     User a = new User(); 
     a.name = "a"; 
     a.surname = "asur"; 
     a.age = 19; 

     User b = new User(); 
     b.name = "b"; 
     b.surname = "bsur"; 
     b.age = 20; 

     userlist.Add(a); 
     userlist.Add(b); 

     var userlistdict = userlist.ToDictionary(x => x.name,x=> new {x.surname,x.age }); 

     if(userlistdict.TryGetValue("b", out var myage)) //myage 

     Console.WriteLine(myage.age); 

    } 
} 
public class User { 
    public string name { get; set; } 
    public string surname { get; set; } 
    public int age { get; set; } 
} 

オーケー結果は後に、私は辞書myage値から値を取得する方法である:20

しかし、C#7どのようにすることができます前に、辞書からmyageの値を取得します。私は他の方法を見つけることができませんでした。ちょうど私はtrygetvalueメソッドでmyageを宣言しました。

+1

あなたの最善の策は、匿名クラスを使用しないことですのようなものを作成する必要が同じ

var userlistdict = userlist.ToDictionary(x => x.name); 
juharr

+0

値= userlistdict ["b"]。これは、キーがあるときに辞書値を取得する方法です。 – Vivek

答えて

5

の3つのオプション:

まず、あなたがこのような拡張メソッドを書くことができます:

public static TValue GetValueOrDefault<TKey, TValue>(
    this IDictionary<TKey, TValue> dictionary, 
    TKey key) 
{ 
    TValue value; 
    dictionary.TryGetValue(dictionary, out value); 
    return value; 
} 

次にとしてそれを呼び出す:第二

var result = userlist.GetValueOrDefault("b"); 
if (result != null) 
{ 
    ... 
} 

、あなたはでoutvarを使用することができますダミー値を提供する:

var value = new { surname = "", age = 20 }; 
if (userlist.TryGetValue("b", out value)) 
{ 
    ... 
} 

またはコメントごとのように:

var value = userlist.Values.FirstOrDefault(); 
if (userlist.TryGetValue("b", out value)) 
{ 
    ... 
} 

第三に、あなたはContainsKey最初に使用することができます

if (userlist.ContainsKey("b")) 
{ 
    var result = userlist["b"]; 
    ... 
} 
+3

ダミーの値を完全に一致させるのを避けるために、辞書から* a *値を得ることができます。例えば、 'userlist.Value.FirstOrDefault()'を実行するなどして、匿名型が変更されていない場合'value'をどのように初期化するかを変更します。 – Servy

+0

@セイビー:おっと、私はそれが好きです - オプションとして編集します。 –

+0

あなたは匿名型のインスタンスを必要としませんが、型だけを必要とするので、式の前に 'true? null: '匿名型の' null'を取得する。 「本当ですか? null:userlist.Values.FirstOrDefault() ' – PetSerAl

0

別のオプションではなく、匿名型の辞書項目値としてUserオブジェクトを格納することですが、その後、最初に型を宣言してTryGetValueにその型を使用できます。あなたは

var value = new { surname = "", age = 10 }; 

if (userlist.TryGetValue("b", out value)) 
{ 

} 
+0

「ToDictionary」の第2引数としてアイデンティティ投影を行う必要はありません。ソース項目を値として使用する場合は、2番目の引数を指定しないでください。 – Servy

+0

それは正しいです。明示的に指定してポイントを強調しました(UserオブジェクトをKeyValuePair項目の値として使用します)。 – Shyju

1

として

var userlistdict = userlist.ToDictionary(x => x.name, x => x); 

User user; 
if (userlistdict.TryGetValue("b", out user)) 
{ 
    Console.WriteLine(user.surname); 
    Console.WriteLine(user.age); 
} 

リストから辞書を作成するための最初の行があります辞書は辞書 `User`の値の型を作るか、代わりに` Tuple `のようなものを使用します。

+0

ありがとうございます。この回答はすでに – Snr

+0

です。申し訳ありませんが、私はそれを見ていませんでした – rosecode