gpt4 book ai didi

linq - 基于使用 LINQ 的函数将 IEnumerable 分区/拆分/部分到 IEnumerable>?

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

我想使用 LINQ 将 C# 中的序列拆分为一系列序列。我做了一些调查,我发现的最接近的 SO 文章是 this .

然而,这个问题只询问如何根据一个常数值对原始序列进行分区。我想根据操作对我的序列进行分区。

具体来说,我有一个包含小数属性的对象列表。

public class ExampleClass
{
public decimal TheValue { get; set; }
}

假设我有一个序列 ExampleClass ,以及 TheValue 的相应值序列是:
{0,1,2,3,1,1,4,6,7,0,1,0,2,3,5,7,6,5,4,3,2,1}

我想将原始序列划分为 IEnumerable<IEnumerable<ExampleClass>>值为 TheValue类似于:
{{0,1,2,3}, {1,1,4,6,7}, {0,1}, {0,2,3,5,7}, {6,5,4,3,2,1}}

我只是不知道这将如何实现。所以,你能帮忙吗?

我现在有一个非常丑陋的解决方案,但有一种“感觉”,即 LINQ 会增加我的代码的优雅度。

最佳答案

好吧,我想我们可以做到这一点......

public static IEnumerable<IEnumerable<TElement>>
PartitionMontonically<TElement, TKey>
(this IEnumerable<TElement> source,
Func<TElement, TKey> selector)
{
// TODO: Argument validation and custom comparisons
Comparer<TKey> keyComparer = Comparer<TKey>.Default;

using (var iterator = source.GetEnumerator())
{
if (!iterator.MoveNext())
{
yield break;
}
TKey currentKey = selector(iterator.Current);
List<TElement> currentList = new List<TElement> { iterator.Current };
int sign = 0;
while (iterator.MoveNext())
{
TElement element = iterator.Current;
TKey key = selector(element);
int nextSign = Math.Sign(keyComparer.Compare(currentKey, key));

// Haven't decided a direction yet
if (sign == 0)
{
sign = nextSign;
currentList.Add(element);
}
// Same direction or no change
else if (sign == nextSign || nextSign == 0)
{
currentList.Add(element);
}
else // Change in direction: yield current list and start a new one
{
yield return currentList;
currentList = new List<TElement> { element };
sign = 0;
}
currentKey = key;
}
yield return currentList;
}
}

完全未经测试,但我认为它可能有效......

关于linq - 基于使用 LINQ 的函数将 IEnumerable<T> 分区/拆分/部分到 IEnumerable<IEnumerable<T>>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6653538/

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