Linq之ToDictionary<TSource, TKey, TElement>的写法

以前一直用 var query = xxx.Select(c=>new {c.X,c.Y}); 来取表中的某二列字段,今天有个应用需要转成Dictionary<T,U>,很少这样使用,居然忘记了写法!

回忆了半天终于写对了,贴在这里备个份,方便以后查找:

using System;
using System.Collections.Generic;
using System.Linq;

namespace DicTest
{
    
class Program
    {
        
static void Main(string[] args)
        {
            List
<Test> lst = new List<Test>();
            
for (int i = 0; i < 10; i++)
            {
                lst.Add(
new Test() { Id = Guid.NewGuid(), Num = i, Name = i.ToString() });
            }

            
Dictionary<Guid, int> dic = lst.ToDictionary(new Func<Test, Guid>(c => c.Id), new Func<Test, int>(c => c.Num));
//如果觉得上面的写法太复杂,还可以简化为
// Dictionary<Guid, int> dic = lst.ToDictionary(c => c.Id, c => c.Num);  

            
foreach (Guid Id in dic.Keys)
            {
                Console.WriteLine(
"Key:{0}\tValue:{1}", Id, dic[Id]);
            }

            Console.Read();
        }
    }


    
public class Test
    {
        
public Guid Id { setget; }
        
public int Num { setget; }
        
public string Name { setget; }
    }
}

如果用Reflector反射一下,会发现实际上编译器自动生成了类似以下代码:(部分名称做了友好处理) 

代码
[CompilerGenerated]
private static Func<Test, Guid> funcGuid;
 
[CompilerGenerated]
private static Func<Test, int> funcInt;
 
[CompilerGenerated]
private static int mNum(Test c)
{
    
return c.Num;
}
 
[CompilerGenerated]
private static Guid mId(Test c)
{
    
return c.Id;
}


private static void Main(string[] args)
{
    List
<Test> lst = new List<Test>();
    
for (int i = 0; i < 10; i++)
    {
        Test _t 
= new Test();
        _t.Id 
= Guid.NewGuid();
        _t.Num 
= i;
        _t.Name 
= i.ToString();
        lst.Add(_t);
    }
    Dictionary
<Guid, int> dic = lst.ToDictionary<Test, Guid, int>((funcGuid != null? funcGuid : (funcGuid = new Func<Test, Guid>(Program.mId)), (funcInt != null? funcInt : (funcInt = new Func<Test, int>(Program.mNum)));
    
foreach (Guid Id in dic.Keys)
    {
        Console.WriteLine(
"Key:{0}\tValue:{1}", Id, dic[Id]);
    }
    Console.Read();
}

PS:今天写的好象都是些水文 :)

作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/yjmyzz/p/1617240.html