C#ToDictionary在C#7

时间:2017-10-23 14:39:48

标签: c# .net 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; }
}

Okey结果是:20

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

3 个答案:

答案 0 :(得分:5)

三个选项:

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

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)
{
    ...
}

其次,通过提供虚拟值,您可以将varout一起使用:

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"];
    ...
}

答案 1 :(得分:1)

你需要创建像

这样的东西
var value = new { surname = "", age = 10 };

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

}

答案 2 :(得分:0)

另一种选择是将User对象存储为字典项值而不是匿名类型,然后您可以先声明类型并在TryGetValue中使用它。

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);
}

从列表创建词典的第一行与

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