gpt4 book ai didi

.net - 在 VB.Net 中使用 LINQ 将集合拆分为 n 个部分

转载 作者:行者123 更新时间:2023-12-04 17:47:32 24 4
gpt4 key购买 nike



在 VB.Net 中,如果我有这样的集合:

Dim collection As IEnumerable(Of Integer) = Enumerable.Range(0, 99)

我如何将它拆分为不确定数量的元素的组/可枚举?

状况

使用 LINQ 查询(不是 MORELinq 或任何其他第三方库)

不写 Function ,只需使用(或附加到集合) LINQ 查询避免插入自定义和通用过程以拆分成部分。

不生成 Anonymous类型(因为我会尊重 VB.Net Option 声明)。

研究

我已经阅读了这些问题,但我无法正确翻译 C# LINQ 查询到 VB.Net(即使在线翻译失败,需要大量修改):

Split a collection into `n` parts with LINQ?

How can I split an IEnumerable<String> into groups of IEnumerable<string>

Split List into Sublists with LINQ

Split a entity collection into n parts

这是我试图从那些 S.O. 中给出的解决方案中适应的两种不同方法。上面的问题,但我的翻译不起作用,第一个无法编译,因为 的条件分组方式 第二个不生成拆分集合,它为每个元素生成一个集合:

1.
    Dim parts As Integer = 4
Dim i As Integer = 0

Dim splits As IEnumerable(Of IEnumerable(Of Integer)) =
From item As Integer In collection
Group By (Math.Max(Interlocked.Increment(i), i - 1) Mod parts)
Into Group
Select Group.AsEnumerable

2.
    Dim parts As Integer = 4

Dim result As IEnumerable(Of IEnumerable(Of Integer)) =
collection.Select(Function(s, i) New With
{
Key .Value = s,
Key .Index = i
}
).GroupBy(Function(item)
Return (item.Index >= (item.Index / parts)) And (item.Index >= item.Value)
End Function,
Function(item) item.Value).Cast(Of IEnumerable(Of Integer))()

预期成绩

所以,如果我有这样的源集合:
Dim collection As IEnumerable(Of Integer) = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

假设我有那个虚构的 LINQ 查询,它可以拆分为一个名为 splits 的变量。通过变量 parts 上指定的值:
Dim parts as Integer = ...
Dim splits As IEnumerable(Of IEnumerable(Of Integer)) =
From value As Integer In collection (Linq Query that splits by given 'parts' value)

如果我选择了 parts值为 4 那么结果将是一个 I Enumerable(Of IEnumerable(Of Integer))其中将包含 3 集合,其中:
splits(0) = {1, 2, 3, 4}
splits(1) = {5, 6, 7, 8}
splits(2) = {9, 10}

如果我选择了 parts值为 5 那么结果将是一个 I Enumerable(Of IEnumerable(Of Integer))其中将包含 2 集合,其中:
splits(0) = {1, 2, 3, 4, 5}
splits(1) = {6, 7, 8, 9, 10}

如果我选择了 parts值为 1 那么结果将是一个 I Enumerable(Of IEnumerable(Of Integer))它将包含相同的源集合,因为我选择仅拆分 1 部分:
splits(0) = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

如果我选择了 parts值为 10 那么结果将是一个 I Enumerable(Of IEnumerable(Of Integer))其中将包含 10 集合,源示例集合的每个值一个集合:
splits(0) = {1}
splits(1) = {2}
splits(2) = {3}
and so on...

最佳答案

您可以使用 Range , SkipTake以实现您的目标。

Dim collection As IEnumerable(Of Integer) = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Dim parts As Integer = 4
Dim count As Integer = CInt(Math.Ceiling(collection.Count() / parts)) '= 3
Dim result As IEnumerable(Of IEnumerable(Of Integer)) = Nothing
'Method 1:
result = From i In Enumerable.Range(0, count) Select collection.Skip(i * parts).Take(parts)
'Method 2:
result = Enumerable.Range(0, count).Select(Function(i) collection.Skip(i * parts).Take(parts))
For Each item In result
Debug.WriteLine(String.Join(", ", item))
Next

1, 2, 3, 4
5, 6, 7, 8
9, 10



强制扩展方法:
Public Module Extensions

<System.Runtime.CompilerServices.Extension()>
Public Function Split(Of TSource)(collection As IEnumerable(Of TSource), ByVal parts As Integer) As IEnumerable(Of IEnumerable(Of TSource))
If (collection Is Nothing) Then Throw New ArgumentNullException("collection")
If (parts < 1) Then Throw New ArgumentOutOfRangeException("parts")
Dim count As Integer = collection.Count()
If (count = 0) Then Return {}
If (parts >= count) Then Return {collection}
Return Enumerable.Range(0, CInt(Math.Ceiling(count / parts))).Select(Function(i) collection.Skip(i * parts).Take(parts))
End Function

End Module
result = collection.Split(4)

关于.net - 在 VB.Net 中使用 LINQ 将集合拆分为 n 个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28847591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com