zoukankan      html  css  js  c++  java
  • Linq数据类型转换

    通过使用 LINQ 查询,可以将源序列用作输入,并采用多种方式修改它以创建新输出序列。可以通过排序和分组来修改序列本身,而不必修改元素本身。但是,LINQ 查询最强大的功能可能在于它能够创建新类型,这一功能在 select 子句中实现

    (一)Student

    public class Student
    {
        
    public string FirstName { getset; }
        
    public string LastName { getset; }
        
    public int Unid { getset; }
        
    public List<int> Scores { getset; }
    }

    (二)选择源元素子集

    学生列表集合

    List<Student> _list = new List<Student>() 

    new Student {FirstName="Svetlana", LastName="Omelchenko",
                 Unid
    =111, Scores = new List<int>{97928160}},
    new Student {FirstName="Claire", LastName="O’Donnell"
                 Unid
    =112, Scores = new List<int>{75849139}},
    new Student {FirstName="Sven", LastName="Mortensen"
                 Unid
    =113, Scores = new List<int>{88946591}}
    };

    1)选择一个成员

    ·选择FirstName

    var list = from p in _list select p.FirstName; 

    foreach (string s in list)
        Console.WriteLine(s);

    这里可以使用匿名类型。因为select部分为字符串类型,所以,也可以是字符串型泛型集合

    List<string> list = (from p in _list 
                        select p.FirstName).ToList
    <string>();
    foreach (string s in list)
       Console.WriteLine(s);

    ·选择Scores

    这里为整型泛型集合,

    可以使用匿名类型

    var list1 = from p in _list select p.Scores;

    foreach (var l in list1)
    {
       
    foreach (int i in l)
          Console.WriteLine(i);
    }

    因为结果集为整型泛型集合,所以也可以使用

    List<List<int>> list = (from p in _list 
    select p.Scores).ToList
    <List<int>>();

    foreach (List<int> l in list)
    {
        
    foreach (int i in l)
           Console.WriteLine(i);
    }

    2)选择多个成员

    ·使用匿名类型

    var q = from p in _list
            select 
    new { Name = p.FirstName + "·" + p.LastName };

    foreach (var x in q)
        Console.WriteLine(x.Name);

    其中select返回部分也为一个复合类型,所以在访问时,要以元素的.Name来访问。

    如果使用匿名类型时,不采用别名赋值的话,会有异常:

    无效的匿名类型成员声明符。匿名类型成员必须使用赋值、简单名称或成员访问来声明。

    ·使用命名对象

    新建Sample

    public class Sample
    {
        
    public string Name { getset; }
    }

    使用

    var q = from p in _list
            select 
    new Sample { Name = p.FirstName + "·" + p.LastName };

    foreach (var x in q)
        Console.WriteLine(x.Name);

    发现与匿名类型复合值时相近。其实也就是:

    List<Sample> list= (from p in _list
        select 
    new Sample { Name = p.FirstName + "·" + p.LastName }).ToList<Sample>();

    foreach (Sample x in list)
        Console.WriteLine(x.Name);

    (三)转换为Xml

    还是用上边那那个学生集合

    List<Student> _list = new List<Student>() 

    new Student {FirstName="Svetlana", LastName="Omelchenko"
                 Unid
    =111, Scores = new List<int>{97928160}},

    new Student {FirstName="Claire", LastName="O’Donnell"
                 Unid
    =112, Scores = new List<int>{75849139}},

    new Student {FirstName="Sven", LastName="Mortensen"
                 Unid
    =113, Scores = new List<int>{88946591}}
                }; 

    var xele 
    = new XElement("Students",
                  from student 
    in _list 
            let x 
    = String.Format("{0},{1},{2},{3}"
            student.Scores[
    0],
            student.Scores[
    1],
            student.Scores[
    2],
            student.Scores[
    3])

                    select 
    new XElement("student",
                        
    new XElement("FirstName",student.FirstName),
                        
    new XElement("LastName", student.LastName),
                        
    new XElement("Unid", student.Unid),
                        
    new XElement("Scores", x)
                        ) 
                    );

    Console.WriteLine(xele);

    现在分析一下:

    1Xelement元素的构造方法

    public XElement(XName name,Object[] content)

    2)上边的生成xml的构造方法其实使用的就是这个

    第一部分:"Students"为根元素

    而下边那么多其实是一行的内容,即占用第二个参数,要记住一句话 查询在select中实现。所以意思就是返回Xelement类型的结果集,而这个结果集正好为构造方法中Object[] content部分。

    可知道student这个元素包含4个子节点。而Scores这里是List<int>类型,所以设定了返回类型及格式为字符串且用逗号隔开。(Let:可以将表达式结果存放在新的范围变量中)。

     

    博客园大道至简

    http://www.cnblogs.com/jams742003/

    转载请注明:博客园

  • 相关阅读:
    一、HTML基础学习
    算法之求正整数的二进制
    JavaScript ajax返回状态
    ajax实现异步校验
    比较喜欢的一种求阶乘的方法:用递归求阶乘
    java中自定义异常类
    我对多态的理解
    包装类和基本类型区别?(integer和int取值范围一样大)
    JAVA中默认的编码方式
    抽象类和接口的区别
  • 原文地址:https://www.cnblogs.com/jams742003/p/1620421.html
Copyright © 2011-2022 走看看