当前位置:首页 > 开发教程 > IT博文 > .NET技术 > C# >

LINQ入门教程之各种标准查询操作符(二)

时间:2013-08-05 08:22 来源:互联网 作者:源码搜藏 收藏

续上篇LINQ入门教程之各种标准查询操作符(一) LINQ入门教程之各种标准查询操作符(二) 7. 聚合操作符 View Code 8. 集合操作符 View Code 9. 生成操作符 1 #region 生成操作符 即从现有序列的值中创建新的序列 2 /// summary 3 /// 返回一个指定类型的

续上篇LINQ入门教程之各种标准查询操作符(一)

        LINQ入门教程之各种标准查询操作符(二)

7.  聚合操作符

LINQ入门教程之各种标准查询操作符(二)View Code

 

8.  集合操作符

LINQ入门教程之各种标准查询操作符(二)View Code

 

9.  生成操作符

LINQ入门教程之各种标准查询操作符(二)
LINQ入门教程之各种标准查询操作符(二)
 1 #region 生成操作符 即从现有序列的值中创建新的序列  2 /// <summary>  3 /// 返回一个指定类型的空集  4 /// </summary>  5 static void EmptyFunction()  6  {  7 string[] name1 = { "1","2" };  8 string[] name2={"3","4","5"};  9 string[] name3 = { "3", "7", "8", "9" }; 10 List<string[]> strlists=new List<string[]>{name1,name2,name3}; 11 //无符合条件,返回空集合 12 IEnumerable<string> nameslist = strlists.Aggregate(Enumerable.Empty<string>( ), 13 (current, next) => next.Length > 5? current.Union(next) : current); 14 15 foreach (string item in nameslist) 16  { 17  Console.WriteLine(item); 18  } 19  } 20 /// <summary> 21 /// 创建一个包含数字序列的集合 包含两个参数,第一个参数是作为序列开始的整数值,第二个参数是要产生的整数序列中数字的个数 22 /// </summary> 23 static void RangeFunction() 24  { 25 IEnumerable<int> intAry = Enumerable.Range(2, 5); 26 foreach (int item in intAry) 27  { 28 Console.Write(item + " "); 29  } 30 }//output: 2 3 4 5 6 31 /// <summary> 32 /// Repeat 操作符创建一个单值序列,将此值重复一定的次数 33 /// </summary> 34 static void RepeatFunction() 35  { 36 IEnumerable<string[]> strAry = Enumerable.Repeat(new string[]{"world","hello"}, 2); 37 foreach (string[] item in strAry) 38  { 39 Console.WriteLine(item[1] +" "+item[0] ); 40  } 41  } 42 //outpupt: 43 //hello world 44 //hello world 45 #endregion
LINQ入门教程之各种标准查询操作符(二)

 

10.  转换操作符

LINQ入门教程之各种标准查询操作符(二)
LINQ入门教程之各种标准查询操作符(二)
 1 #region 转换操作符  将输入对象的类型转变为序列的动作  2 /// <summary>  3 /// 将查询的输入以IEnumerable<Of T>类型返回  4 /// </summary>  5 static void AsEnumerableFunction()  6  {  7 DataContext context = new DataContext(StaticData.ConnectSql);  8 Table<Contact> contacts = context.GetTable<Contact>();  9 //使用AsEnumerable操作符将类型自带的Where方法替换为标准查询操作符Where的方法  10 //这里的Where方法 区分查询条件的大小写,  11 //如果用“G”,只能查询出‘G’开头的Firstname,若换做"g",可以查询出所有以g/G开头的Firstname   12 IEnumerable<Contact> query = contacts.AsEnumerable().Where(con=>con.FirstName.Contains("g"));  13 foreach (Contact item in query)  14  {  15 Console.Write(item.FirstName + " ");  16  }  17 //这里的Where方法 不区分查询条件的大小写 用g/G都可以  18 IEnumerable<Contact> query2 = contacts.Where(con => con.FirstName.Contains("G"));  19 Console.WriteLine("");  20 foreach (Contact item in query2)  21  {  22 Console.Write(item.FirstName + " ");  23  }  24  }  25 //output:  26 //Gong  27 //Gong gong1 gong2 gong3 gong4  28 /// <summary>  29 /// 将IEnumerable集合中的元素转换为某种指定的类型  30 /// </summary>  31 static void CastFunction( )  32  {  33 //ArrayList并不实现IEnumerable(Of T)  34 ArrayList names = new ArrayList( );  35 var repeatlist = Enumerable.Range(1, 10);  36 foreach (int item in repeatlist)  37  {  38  names.Add(item);  39  }  40 //通过使用Cast操作符,可以使用标准查询操作符来查询此序列  41 IEnumerable<int> query=names.Cast<int>().Select(name=>name);  42 foreach (int item in query)  43  {  44 Console.Write(item +" ");  45  }  46  }  47 //output:  48 //1 2 3 4 5 6 7 8 9 10  49 /// <summary>  50 /// 实现一个基于特定的类型对IEnumerable对象的元素进行过滤  51 /// </summary>  52 static void OfTypeFunction()  53  {  54 ArrayList names = new ArrayList(7);  55 names.Add("hello");  56 names.Add("thank you");  57 names.Add(2);  58 names.Add(4);  59 names.Add("yy");  60 names.Add(6);  61 //oftype方法返回序列中可以转为int型的元素,通过在IEnumerable对象上使用OfType操作符,就可以使用标准查询操作符来查询此序列  62 IEnumerable<int> query = names.OfType<int>();  63 foreach (int item in query)  64  {  65 Console.Write(item+ " ");  66  }  67  }  68 //output:  69 //2 4 6  70 /// <summary>  71 /// 用于实现从一个IEnumerable序列创建一个数组 ,ToArray会强制查询立即执行  72 /// </summary>  73 static void ToArrayFunction()  74  {  75 DataContext context = new DataContext(StaticData.ConnectSql);  76 Table<Contact> contacts = context.GetTable<Contact>();  77 var query = contacts.Select(con => con.FirstName).ToArray();  78 foreach (string item in query)  79  {  80 Console.Write(item+" ");  81  }  82  }  83 //output:Gond gong2 gong3 gong4 gong5  84 /// <summary>  85 /// ToDictionary操作符将序列中的所有返回元素插入到一个Dictionary(Of TKey,TValue)对象中,会强制查询立即执行  86 /// </summary>  87 static void ToDictionaryFunction()  88  {  89 DataContext context = new DataContext(StaticData.ConnectSql);  90 Table<Contact> contact = context.GetTable<Contact>( );  91 Dictionary<string, Contact> dict = contact.Where(con=>con.FirstName.Contains("2")).ToDictionary(con => con.FirstName);  92 foreach (KeyValuePair<string,Contact> item in dict)  93  {  94 Console.WriteLine(item.Key+" "+item.Value.MiddleName);  95  }  96  }  97 //output:  98 //gong2 wen2  99 /// <summary> 100 /// 将一个IEnumerable序列集合转换为一个List(Of T)对象,它也会强制查询立即执行 101 /// </summary> 102 static void ToListFunction( ) 103  { 104 DataContext context = new DataContext(StaticData.ConnectSql); 105 Table<Contact> contact = context.GetTable<Contact>(); 106 IEnumerable<string> query = (from c in contact where c.FirstName.Contains("2") select c.FirstName).ToList(); 107 foreach (string item in query) 108  { 109  Console.WriteLine(item); 110  } 111  } 112 //output: gong2 113 /// <summary> 114 /// 基于一个特定的主键,将返回的元素放置到一个Lookup(Of Tkey,TElement)对象中 115 /// Lookup是主键的集合,每个主键都映射到一个或多个值上,可以认为Lookup对象是一个一对多的字典 116 /// </summary> 117 static void ToLookupFunction() 118  { 119 DataContext context = new DataContext(StaticData.ConnectSql); 120 Table<Contact> contact = context.GetTable<Contact>(); 121 //Title作为key,Middelname和lastanem作为Element, key对应多个Element 122 ILookup<string, string> lkp = contact.ToLookup(con => con.Title, con => con.MiddleName + con.LastName); 123 foreach (IGrouping<string,string> item in lkp) 124  { 125  Console.WriteLine(item.Key); 126 foreach (string subitem in item) 127  { 128 Console.WriteLine(" "+subitem); 129  } 130  } 131  } 132 //output: 133 //xinwen2 134 // wentao 135 // wenstaos 136 //xinwen 137 // wen2tao2 138 // wen3tao3 139 // wen4tao4 140 // wen5tao5 141 #endregion
LINQ入门教程之各种标准查询操作符(二)

 

11.  元素操作符

LINQ入门教程之各种标准查询操作符(二)
LINQ入门教程之各种标准查询操作符(二)
#region 元素操作符 从一个序列返回单个特定的元素 /// <summary> /// 将一个空集合替换为包含默认的单个值得集合 /// </summary> static void DefaultIfEmptyFunction()
        {
            DataContext context = new DataContext(StaticData.ConnectSql);
            Table<Contact> contacts = context.GetTable<Contact>(); //必须指定类型,用var在foreach时会报错 IEnumerable<Contact> query=from con in contacts where con.FirstName.StartsWith("gg") select con;
            Contact defaultContact = new Contact() { FirstName="test",MiddleName="defaultIfEmpty"}; foreach (Contact item in query.DefaultIfEmpty(defaultContact)) //foreach (string item in query.DefaultIfEmpty("none"))  {
                Console.Write(item.FirstName+" "+item.MiddleName);
            }
        } //output: //test defaultIfEmpty /// <summary> /// ElementAt返回集合中给定索引处的元素。集合是零基(索引从0开始计)的,返回值是数据源中特定位置的元素 /// ElementAtOrDefault 将ElementAt操作符和DefaultIfEmpty操作符的部分功能结合在一起,返回在某一特定处的元素,如果索引超出范围则返回默认值 /// </summary> static void ElementAtFunction()
        {
            DataContext context = new DataContext(StaticData.ConnectSql);
            Table<Contact> contacts = context.GetTable<Contact>( );
            IEnumerable<string> query = from c in contacts where c.FirstName.StartsWith("G") select c.FirstName;
            Console.WriteLine(query.ElementAt(0)); try {
                query.ElementAt(10000);
            } catch (Exception ex)
            {
                Console.WriteLine("error:"+ex.Message);
            } //超出索引范围 返回默认值 Console.WriteLine(query.ElementAtOrDefault(10000));
        } //output: //Gong //"error:"+指定的参数已超出有效值的范围 //参数名:index /// <summary> /// First查询集合中符合条件的第一个元素 Last查询集合中符合条件的最后一个元素 ,若没有发现任何元素抛出异常 /// FirstDefault 和LastDefualt,若没有发现任何元素则返回默认值 /// </summary> static void FirstLastFunction()
        {
            DataContext context = new DataContext(StaticData.ConnectSql);
            Table<Contact> contacts = context.GetTable<Contact>();
            IEnumerable<Contact> query = from c in contacts select c;
            Contact model = new Contact() {FirstName="test" };
            model = query.First(); //输出 gong Console.WriteLine("First:" + model.FirstName); //输出 gong model = query.FirstOrDefault();
            Console.WriteLine("FirstDefault" + model.FirstName); try {
                model = query.Last(con => con == null);
                Console.WriteLine("Last:" + model.FirstName);
            } catch (Exception ex)
            { //在query.Last处报错,error:序列不包含任何匹配元素 Console.WriteLine("Last error"+ex.Message);
            }
            model = query.LastOrDefault(con => con == null); try {
                Console.WriteLine("LastDefault:" + model.FirstName);
            } catch (Exception ex)
            { //在调用model时报错,error:未将对象引用设置到对象的实例 Console.WriteLine("LastDefault Error:"+ex.Message);
            }
        } /// <summary> /// Single操作符从一个序列中返回单个元素,或唯一满足某一特定条件的元素,如果包含一个以上或没有发现元素则抛出异常 /// SingleOrDefault从一个序列中返回单个元素,如果没有发现元素会返回一个默认值,如果返回多个元素,则抛出异常 /// </summary> static void SingleFunction( )
        {
            DataContext context = new DataContext(StaticData.ConnectSql);
            Table<Contact> contacts = context.GetTable<Contact>( );
            IEnumerable<string> quuery = contacts.Where(con => con.FirstName.Equals("Gong2")).Select(con => con.FirstName);
            Console.WriteLine("single:"+quuery.Single());
            IEnumerable<string> query2 = contacts.Where(con => con.FirstName.Equals("test")).Select(con => con.FirstName);
            Console.WriteLine("single default:"+query2.SingleOrDefault());
        } //output: //single:gong2 //single default: #endregion
LINQ入门教程之各种标准查询操作符(二)

 

12.  相等操作符

LINQ入门教程之各种标准查询操作符(二)
LINQ入门教程之各种标准查询操作符(二)
 1 #region 相等操作符  2 /// <summary>  3 /// SequenceEqual 通过比较两个序列来检查他们相应的元素是否相同,如果序列有相同数量的元素,并且对应元素的值相同,则返回true,否则返回false  4 /// </summary>  5 static void SequenceEqualFunction()  6  {  7 int[] numbers1 = { 1, 2, 3, 4, 5, 6, 7 };  8 int[] numbers2 = { 1, 2, 3, 4, 5, 6, 7 };  9 int[] numbers3 = { 1, 2, 3, 4, 5, 7, 6}; 10 bool flag = numbers1.SequenceEqual(numbers2); 11  Console.WriteLine(flag); 12 flag = numbers1.SequenceEqual(numbers3); 13  Console.WriteLine(flag); 14  } 15 //output: 16 //True 17 //False 18 #endregion
LINQ入门教程之各种标准查询操作符(二)

 

13.  量词操作符

LINQ入门教程之各种标准查询操作符(二)
LINQ入门教程之各种标准查询操作符(二)
 1 #region 量词操作符 返回一个Boolean值,指示序列中是否存在部分或全部元素符合某个特定的条件  2 /// <summary>  3 ///All 判定在集合中是否所有的值都满足特定的条件,返回值是boolean类型。如果满足,返回true,否则 false。  4 /// </summary>  5 static void AllFunction()  6  {  7 Contact[] contacts = { new Contact{FirstName="gwt"}  8 ,new Contact{FirstName="gwt1"}  9 ,new Contact{FirstName="gwt2"} 10 ,new Contact{FirstName="gwt3"} 11 ,new Contact{FirstName="gwt4"} 12 ,new Contact{FirstName="lining"}}; 13 bool flag = contacts.All(name => name.FirstName.StartsWith("gwt")); 14 Console.WriteLine("All:"+flag); 15 flag = contacts.Any(name => name.FirstName.StartsWith("gwt")); 16 Console.WriteLine("Any:"+flag); 17 IEnumerable<string> query = contacts.Select(name => name.FirstName); 18 flag = query.Contains("gwt"); 19 Console.WriteLine("Contains:"+flag); 20  } 21 //output: 22 //All:False 23 //Any:True 24 //Contains:True  25 #endregion
LINQ入门教程之各种标准查询操作符(二)

 

14.  分割操作符

LINQ入门教程之各种标准查询操作符(二)
LINQ入门教程之各种标准查询操作符(二)
 1 #region 分割操作符 是指将一个单一的输入序列划分成两个或多个部分或序列 ,同时不会对输入元素重排序,然后返回一个新形成的部分  2 /// <summary>  3 /// Skip: 跳过一些元素 到达序列中一个特定的位置  4 /// SkipWhile只要特定的条件为真,就继续略过元素,直到出现条件不满足时,返回剩余的元素,剩余的元素不再做判断。  5 /// </summary>  6 static void SkipFunction()  7  {  8 IEnumerable<int> query = Enumerable.Range(1, 10);  9 IEnumerable<int> query2 = query.Skip(5); 10 Console.WriteLine("Skip"); 11 foreach (int item in query2) 12  { 13 Console.Write(item + " "); 14  } 15  Console.WriteLine(); 16 Console.WriteLine("SkipWhile"); 17 //条件为num>5, 满足大于5的数被略过,query 为5 4 3 2 1 18 //如果条件为num<5 ,则query集合为10,9,8,7,6,5,4,3,2,1(因为第一个10<5为false,剩余元素不再做判断)这是一个坑啊,弄了半天才整明白 19 IEnumerable<int> query3 = (from n in query orderby n descending select n  ).SkipWhile(num=>num>5); 20 foreach (int item in query3) 21  { 22 Console.Write(item+" "); 23  } 24 query3 = (from n in query orderby n descending select n).SkipWhile(num => num < 5); 25  Console.WriteLine(); 26 foreach (int item in query3) 27  { 28 Console.Write(item + " "); 29  } 30  } 31 //output: 32 //6 7 8 9 10 33 //5 4 3 2 1 34 /// <summary> 35 /// 返回某个序列中连续的元素子序列,子序列开始于原序列的开头,结束于某个指定的位置。 36 /// Take :从序列的开头返回指定数量的连续元素 37 /// TakeWhile:只要满足指定的条件,就会返回序列的元素,一旦出现条件不满足,查询不会继续下去,即使后面有满足条件的元素。 38 /// </summary> 39 static void TakeFunction() 40  { 41 int[] randomNumbers = { 86,2,77,94,100,65,5,22,70,55,81,66,45}; 42 IEnumerable<int> takeTopFour = randomNumbers.OrderByDescending(num => num).Take(4); 43 Console.Write("Take:"); 44 foreach (int item in takeTopFour) 45  { 46 Console.Write(item + " "); 47  } 48  Console.WriteLine(); 49 Console.Write("TakeWhile:"); 50 IEnumerable<int> takeGreaterThan50=(from n in randomNumbers orderby n select n).TakeWhile(n=>n<50); 51 foreach (int item in takeGreaterThan50) 52  { 53 Console.Write(item+" "); 54  } 55  } 56 //output: 57 //Take:100 94 86 81 58 //TakeWhile:2 5 22 45 59 #endregion
LINQ入门教程之各种标准查询操作符(二)

 

最后出一个使用查询操作符的例子

LINQ入门教程之各种标准查询操作符(二)
LINQ入门教程之各种标准查询操作符(二)
 1 #region 使用查询操作符  2 static void UseSearchOperate()  3  {  4 DataContext context = new DataContext(StaticData.ConnectSql);  5 Table<Contact> contacts = context.GetTable<Contact>();  6 Table<Employee> employees = context.GetTable<Employee>();  7 //使用查询语法  8 var query = from con in contacts  9 join emp in employees on con.ContactID equals emp.ContactID 10 where con.FirstName.StartsWith("gong2") 11 && emp.HireDate.Year > 2012 12 orderby con.FirstName 13 orderby con.LastName 14 select new { emp.EmployeeID, con.LastName, con.FirstName, emp.Title, con.EmailAddress, emp.HireDate }; 15 //使用方法语法 16 var query2 = contacts.Join(employees, con => con.ContactID, emp => emp.ContactID, (con, emp) => new { con = con, emp = emp }) 17 .Where(c => c.con.FirstName.StartsWith("gong2")) 18 .Where(c => c.emp.HireDate.Year > 2012) 19 .OrderBy(c => c.con.FirstName) 20 .ThenBy(c => c.con.LastName) 21 .Select(o=>new {o.con.FirstName,o.con.LastName,o.con.EmailAddress,o.emp.EmployeeID,o.emp.Title,o.emp.HireDate}); 22 foreach (var item in query2) 23  { 24 Console.WriteLine(item.FirstName + " " + item.HireDate + " " + item.EmailAddress); 25  } 26  } 27 //output: 28 //gong2 2013-08-01 97182234@qq.com 29 //gong2 2013-08-01 97182234@qq.com 30 //gong2 2013-08-01 97182234@qq.com 31 //gong2 2013-08-01 97182234@qq.com 32 #endregion
LINQ入门教程之各种标准查询操作符(二)

C#阅读排行

最新文章