C#ToDictionary在C#7之前获取匿名类型值

Snr*_*Snr 5 .net c# anonymous-types

你好,这是我如何从C#7后的字典myage值中获得价值

 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; }
}
Run Code Online (Sandbox Code Playgroud)

Okey的结果是:20

但在C#7之前,如何从字典中获取myage值.我找不到任何其他方式.我发现在trygetvalue方法中声明了myage.

Jon*_*eet 5

三种选择:

首先,您可以编写如下的扩展方法:

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

然后将其称为:

var result = userlist.GetValueOrDefault("b");
if (result != null)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

其次,你可以使用varout通过提供一个虚拟的值:

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

或者根据评论:

var value = userlist.Values.FirstOrDefault();
if (userlist.TryGetValue("b", out value))
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

第三,你可以ContainsKey先使用:

if (userlist.ContainsKey("b"))
{
    var result = userlist["b"];
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 为了避免必须完美地匹配虚拟值,你可以从字典中获取*a*值,例如通过执行`userlist.Value.FirstOrDefault()`,这样如果匿名类型改变你就不必也会改变你初始化`value`的方式. (3认同)