永发信息网

linq中三目表达式返回列表可以吗

答案:2  悬赏:70  手机版
解决时间 2021-03-21 12:33
  • 提问者网友:半生酒醒
  • 2021-03-20 22:02
linq中三目表达式返回列表可以吗
最佳答案
  • 五星知识达人网友:酒醒三更
  • 2021-03-20 22:10
先上一段代码,
这段代码使用扩展方法实现下面的要求:
取进程列表,进行过滤(取大于10M的进程)
列表进行排序(按内存占用)
只保留列表中指定的信息(ID,进程名)
1 var res = Process.GetProcesses()
2 .Where(s => s.WorkingSet64 > 10 * 1024 * 1024)
3 .OrderByDescending(s => s.WorkingSet64)
4 .Select(s => new { ID = s.Id, Name = s.ProcessName });

为了能清楚理解上面代码的内部动作,我们需要介绍几组概念.

1. IEnumerable接口
Process.GetProcesses()的返回值是一个Process的数组,而在C#中,所有数组对象均实现了IEnumerable接口.

IEnumerable接口之所以重要,是因为 上面代码中的Where, OrderByDescending, Select 等LINQ中的标准查询操作符都需要使用该类型的对象做为参数.
那么,上面代码中的Where, OrderByDescending, Select 是哪里来的呢? 它们是扩展方法, 基于IEnumerable接口类型的扩展方法.
在LINQ中, 术语"序列" 就是指所有实现了IEnumerable接口的对象.

我们给出Where扩展方法的实现代码:

1 public static IEnumerable Where(
2 this IEnumerable source,
3 Func predicate)
4 {
5 foreach (TSource element in source)
6 {
7 if (predicate(element))
8 yield return element;
9 }
10 }

其第一参数中的this关键字就证明了它是一个扩展方法,参数类型就是IEnumerable 关键字yield return 就构成了一个迭代器.
我们来看一下迭代器的背景知识.

2. 迭代器
从结果的角度看,迭代器与一个返回集合数据的传统方法没有什么区别,因为都是返回按一序列排列的值.
比如下面的代码,就返回一个集合的值.
1 int[] OneTwoThree()
2 {
3 return new[] { 1, 2, 3 };
4 }

不过,C#中的迭代器的行为却非常特殊.迭代器将不会一次性返回整个集合中的所有值.而是每次返回一个.这样的设计减少了内存需求.
我们构建一个迭代器的例子,看一看这个特性.

1 private void button2_Click(object sender, EventArgs e)
2 {
3 foreach (var m in OneTwoThree())
4 {
5 Console.WriteLine(m);
6 }
7 }
8 static IEnumerable OneTwoThree()
9 {
10 Console.WriteLine("returning 1");
11 yield return 1;
12 Console.WriteLine("returning 2");
13 yield return 2;
14 Console.WriteLine("returning 3");
15 yield return 3;
16 }
全部回答
  • 1楼网友:千杯敬自由
  • 2021-03-20 22:17
总的来说,lambda 表达式可以用在任何需要使用匿名方法,或是代理的地方。编译器会将lambda表达式编译为标准的匿名方法
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯