.NET 6.0 —— System.Linq

https://www.zhihu.com/question/449756804

System.Linq — 可枚举支持IndexRange参数

该方法现在接受可枚举项末尾的索引,如下例所示。Enumerable.ElementAt

Enumerable.Range(1, 10).ElementAt(^2); // returns 9

添加了一个接受参数的重载。它简化了对可枚举序列的切片:Enumerable.TakeRange

  • source.Take(..3) 代替 source.Take(3)
  • source.Take(3..) 代替 source.Skip(3)
  • source.Take(2..7) 代替 source.Take(7).Skip(2)
  • source.Take(^3..) 代替 source.TakeLast(3)
  • source.Take(..^3) 代替 source.SkipLast(3)
  • source.Take(^7..^3)而不是.source.TakeLast(7).SkipLast(3)

感谢@dixin

作者:醉书生
链接:https://www.zhihu.com/question/449756804/answer/2219422015
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

System.Linq — TryGetNonEnumeratedCount

TryGetNonEnumeratedCount方法尝试在不强制枚举的情况下获取源可枚举的计数。这种方法在枚举之前预分配缓冲区很有用的情况下很有用,如下例所示。

List<T> buffer = source.TryGetNonEnumeratedCount(out int count) ? new List<T>(capacity: count) : new List<T>();
foreach (T item in source)
{
    buffer.Add(item);
}

TryGetNonEnumeratedCount检查实现ICollection/或利用Linq 使用的一些内部优化的源ICollection<T>

System.Linq — DistinctBy/ UnionBy/ IntersectBy/ExceptBy

新的变体已添加到集合操作中,允许使用键选择器函数指定相等性,如下面的示例所示。

Enumerable.Range(1, 20).DistinctBy(x => x % 3); // {1, 2, 3}

var first = new (string Name, int Age)[] { ("Francis", 20), ("Lindsey", 30), ("Ashley", 40) };
var second = new (string Name, int Age)[] { ("Claire", 30), ("Pat", 30), ("Drew", 33) };
first.UnionBy(second, person => person.Age); // { ("Francis", 20), ("Lindsey", 30), ("Ashley", 40), ("Drew", 33) }

System.Linq — MaxBy/MinBy

MaxByMinBy方法允许使用键选择器查找最大或最小元素,如下例所示。

var people = new (string Name, int Age)[] { ("Francis", 20), ("Lindsey", 30), ("Ashley", 40) };
people.MaxBy(person => person.Age); // ("Ashley", 40)

System.Linq — Chunk

Chunk 可用于将可枚举的源分块为固定大小的切片,如下例所示。

IEnumerable<int[]> chunks = Enumerable.Range(0, 10).Chunk(size: 3); // { {0,1,2}, {3,4,5}, {6,7,8}, {9} }

归功于罗伯特·安德森

System.Linq的- FirstOrDefault/ LastOrDefault/SingleOrDefault过载采取默认参数

现有FirstOrDefault/ LastOrDefault/SingleOrDefault方法返回如果源枚举是空的。添加了新的重载,接受在这种情况下要返回的默认参数,如下面的示例所示。default(T)

Enumerable.Empty<int>().SingleOrDefault(-1); // returns -1

感谢@ Foxtrek64

System.Linq —Zip接受三个枚举的重载

邮编方法现在支持组合三个枚举接口,你可以在下面的例子中看到。

var xs = Enumerable.Range(1, 10);
var ys = xs.Select(x => x.ToString());
var zs = xs.Select(x => x % 2 == 0);

foreach ((int x, string y, bool z) in Enumerable.Zip(xs,ys,zs))
{
}

感谢霍耀元

 



作者:醉书生
链接:https://www.zhihu.com/question/449756804/answer/2219422015
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
原文地址:https://www.cnblogs.com/panpanwelcome/p/15785190.html