Linq 入门系列 select篇

其实也是对网上linq--select篇的扩充
我在这里把两种语法都写,lambda,linq写法,方便大家更好的去学习,同时也增加了一些新的东西,如解释,例子的扩充。。。

今后一段时间,我会对linq一些基本写法进行例子和解释结合的方式和大家进行分享。

 class Program
    
{
        
private static List<Student> GetStudents()
        
{
            List
<Student> students = new List<Student> 
             
new Student{ Name="YOUNG", Age=25, Language="Chinese"},
             
new Student{ Name="JESSIE", Age=21, Language="Scotland"},
             
new Student{ Name="KELLY", Age=18, Language="English"},
             
new Student{ Name="JUNE", Age=20, Language="English"},
             
new Student{ Name="ADRIAN", Age=22, Language="Italy"},
             
new Student{ Name="BRUCE", Age=17, Language="Scotland"},
             
new Student{ Name="BRANT", Age=30, Language="Germany"},
             
new Student{ Name="BEN", Age=25, Language="Chinese"}
             }
;
            
return students;

        }


        
static void Main(string[] args)
        
{
            List
<Student> studentList = GetStudents();

            Select(studentList);
        }


        
private static void Select<T>(T studentList)
        
{
            OnlySearch(studentList);
            SearchCollectChangeOtherCollect(studentList);
            BuilderAnomy();
            BuilderAnomyExter();
            SelectLambda();
            ComplexSelect();
            ComplexSelectLambda();
        }


        
private static void OnlySearch<T>(T studentList)
        
{
            Console.WriteLine(
"<hr>只查询合适对象集合的某个属性:<br>");

            
//lamb的写法
            var students = RevealChangeType(studentList).Where(n=>n.Language == "Chinese").Select(n=>n.Name);

            
//linq的写法
            
//var students = from n in RevealChangeType(studentList)
            
//               where n.Language == "Chinese"
            
//               select n.Name;

            
foreach (var student in students)
            
{
                Console.WriteLine(
string.Format("<span class='result'>{0}</span>", student));
            }

        }


        
private static IEnumerable<Student> RevealChangeType<T>(T obj)
        
{
            IEnumerable
<Student> student = obj as IEnumerable<Student>;

            
return student;
        }


        
private static void SearchCollectChangeOtherCollect<T>(T obj)
        
{
            Console.WriteLine(
"<hr>从一个集合中查询,转化到另外一个集合:<br>");

            
//age Array
            int[] intArray =25143 };

            
//lamb的写法
            var students = intArray.SelectMany(n=>RevealChangeType(obj).Where(s=>s.Age == n));

            
//linq的写法
            
//var students = from s in RevealChangeType(obj)
            
//               from n in intArray
            
//               where s.Age == n
            
//               select s;

            
foreach (var student in students)
            
{
                Console.WriteLine(
string.Format("<span class='result'>{0}</span>", student.Name));
            }

        }


        
private static void BuilderAnomy()
        
{
            Console.WriteLine(
"<hr>构建匿名类型:<br>");

            List
<Student> studentList = GetStudents();
            
int[] intArray = 3164 };

            
//lamb的写法
            var stu = intArray.Select(n=>new { Id = n, Name = (studentList as List<Student>)[n].Name });

            
//linq的写法
            
//var stu = from n in intArray
            
//          select  new{Id = n,Name=(studentList as List<Student>)[n].Name};

            
foreach (var s in stu)
            
{
                Console.WriteLine(
string.Format("<div class='result'>id:{0};name:{1}</div>", s.Id, s.Name));
            }

        }


        
private static void BuilderAnomyExter()
        
{
            Console.WriteLine(
"<hr>构建匿名类型2——扩展已有类:<br>");

            List
<Student> studentList = GetStudents();
            
int[] intArray = 3164 };

            
//lamb的写法
            var students = intArray.Select(n=>new { Id = n, studentList[n].Name, studentList[n].Age });

            
//linq的写法
            
//var students = from n in intArray
            
//               select new {Id = n, studentList[n].Name, studentList[n].Age};

            
foreach (var student in students)
            
{
                Console.WriteLine(
string.Format("<div class='result'>id:{0}; name:{1}; age:{2}</div>", student.Id, student.Name, student.Age));
            }

        }


        
private static void SelectLambda()
        
{
            Console.WriteLine(
"<hr>select的Lambda表达式:<br>");

            List
<Student> studentList = GetStudents();
            
int[] intArray = 3164 };

            
//lamb的写法
            var stu = intArray.Select(i=>new { Id = i, studentList[i].Name });

            
//linq的写法
            
//var stu = from i in intArray
            
//          select new {Id = i, studentList[i].Name};

            
foreach (var student in stu)
            
{
                Console.WriteLine(
string.Format("<div class='result'>id:{0}; name:{1}</div>", student.Id, student.Name));
            }

        }


        
private static void ComplexSelect()
        
{
            Console.WriteLine(
"<hr>复合选择:<br>");

            List
<Student> studentList = GetStudents();
            
string[] stringArray = "Ajax""Csharp""Javascript""Css Desige""Asp.net""Gis" };

            
//lamb的写法
            
//var stu = stringArray.Where(s=>s.Length > 8).SelectMany(s=>studentList.Where(str1=>str1.Age > 23).Select(str=>new { book = s, name = str.Name }));
            var stu = studentList.Where(sl=>sl.Age > 23).SelectMany(sl=>stringArray.Where(s=>s.Length > 8).Select(s=>new { name = sl.Name, book = s }));

            
//linq的写法
            
//var stu = from sl in studentList 
            
//           where sl.Age > 23
            
//           from s in stringArray 
            
//           where s.Length > 8
            
//           select new {name = sl.Name, book = s};

            
foreach (var student in stu)
            
{
                Console.WriteLine(
string.Format("<div class='result'>{0} is studying {1}</div>", student.name, student.book));
            }

        }


        
private static void ComplexSelectLambda()
        
{
            Console.WriteLine(
"<hr>多重选择的Lambda表达式:<br>");

            List
<Student> studentList = GetStudents();
            
string[] stringArray = "Ajax""Csharp""Javascript""Css Desige""Asp.net""Gis" };

            
//lamb的写法
            
//var stu = studentList.SelectMany(s=>stringArray.Select(str => s.Name + "has a book names " + str));

            
//linq的写法
            var stu = from sl in studentList                     
                      from s 
in stringArray                      
                      select 
new {name=sl.Name,language=s};

            
foreach (var s in stu)
            
{
                Console.WriteLine(
string.Format("<div class='result'>{0}</div>", s));
            }

        }

    }


    
sealed class Student
    
{
        
public int age;
        
public int Age
        
{
            
get return age; }
            
set { age = value; }
        }


        
private string name;
        
public string Name
        
{
            
get return name; }
            
set { name = value; }
        }


        
private string language;
        
public string Language
        
{
            
get return language; }
            
set { language = value; }
        }

    }

对此方法的补充
   ComplexSelectLambda()
**********************************
但是现在(ComplexSelectLambda())输出的结果是:
<hr>多重选择的Lambda表达式:<br/>
<div class='result'>{name=YOUNG, language=Ajax}</div>
<div class='result'>{name=YOUNG, language=Csharp}</div>
<div class='result'>{name=YOUNG, language=Javascript}</div>
<div class='result'>{name=YOUNG, language=Css Desige}</div>
<div class='result'>{name=YOUNG, language=Asp.net}</div>
<div class='result'>{name=YOUNG, language=Gis}</div>
**********************************

//////////////////////////////////
问题:如何写才能输入这样的结果?
     
<name=young,language=Ajax>
<name=JESSIE,language=Csharp>
<name=KELLY,language=Javascript>
<name=JUNE,language=Css Desige>
<name=ADRIAN,language=Asp.net>
<name=BRUCE,language=Gis>
//////////////////////////////////

代码:
private static void ComplexSelectLambdaTwo()
        
{
            Console.WriteLine(
"<hr>多重选择的Lambda表达式:<br>");

            List
<Student> studentList = GetStudents();
            
string[] stringArray = "Ajax""Csharp""Javascript""Css Desige""Asp.net""Gis" };

            var langlist 
= stringArray.Select(( la, i) => new { lang = la, index = i });

            var stulist 
= studentList.Select(( st, i) => new { name = st.Name, index = i });

            var stu2 
= from la in langlist
                       from st 
in stulist
                       where la.index 
== st.index
                       select 
new {name = st.name, language = la.lang};

            
foreach (var s2 in stu2)
            
{
                Console.WriteLine(
string.Format("<name={0},language={1}>", s2.name, s2.language));
            }

        }

posted @ 2007-07-10 17:55  RicoRui  阅读(4733)  评论(7编辑  收藏  举报