微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 按内容大小拆分double的集合

我有一个数字集合(集合),它可以是任何大小,包含负数和正数.我试图根据一些标准将其拆分.从集合中的第一个数字开始,我想制作一个集合,而这个数字高于-180且低于180.任何高于180的数字都会进入一个新的集合,或者任何低于-180的数字都会进入一个新的集合.如果数字再次在可接受的参数范围内,则会再次进入新的集合.问题是收藏品需要保持秩序.

例如.

收集100:

>前50个介于180和-180之间.
>接下来的20个低于-180
>接下来的20个都在180以上
>最后10个在180到-180之间

从上面的集合中,我现在应该有4个单独的集合,其顺序与原始的1个集合相同.

>第一个集合编号,原始顺序介于180和-180之间
>第二个集合编号,原始顺序低于-180
>原始订单中的第三个收集编号高于180
>第四个集合编号,原始顺序介于180和-180之间

我做了一个尝试,我有什么不起作用,是一个令人讨厌的if语句混乱.我不太了解linq,但我认为使用它可能会有更优雅的解决方案.任何人都可以帮我这里,或者向我展示如何创建一个linq语句,或者建议如何让我的if语句工作,如果这是最好的方法.

Collection<Tuple<Collection<double>,int>> collectionOfDataSets = new Collection<Tuple<Collection<double>,int>>();
Collection<double> newDataSet = new Collection<double>();
for (int i = 0; i < dataSet.Count; i++) {
    if (dataSet[i] < 180 && dataSet[i] > -180) {
        newDataSet.Add(dataSet[i]);
    } else {
        Tuple<Collection<double>,int> lastEntry = collectionOfDataSets.LastOrDefault(b => b.Item2 == i--);
        if (lastEntry != null){
            lastEntry.Item1.Add(dataSet[i]);
        }
        double lastInLastCollection = collectionOfDataSets.ElementAtOrDefault(collectionOfDataSets.Count).Item1.Last();
        if (newDataSet.Count > 0 && lastInLastCollection!= dataSet[i]){
            collectionOfDataSets.Add(new Tuple<Collection<double>,int>(newDataSet,i));                        
        }
        newDataSet = new Collection<double>();
    }
}

提前感谢您的任何帮助.

解决方法

你的例子很复杂.我将首先陈述并解决一个更简单的问题,然后使用相同的方法解决您的原始问题.

我想将一个数字列表分成连续的偶数和奇数组.例如,鉴于列表2,2,4,3,6,2我会将其分为三组[2,4],[3],[6,2]

这可以使用GroupAdjacentBy方法简洁地完成

> var numbers = new List<int>{2,2};
> numbers.GroupAdjacentBy(x => x % 2)
[[2,2]]

解决您的问题,只需使用您的分类函数替换上面的奇偶分类函数

> var points = new List<int>{-180,180};
> var f = new Func<int,int>(x => points.BinarySearch(x));
> var numbers = new List<int>{6,-50,100,190,200,20};
> numbers.GroupAdjacentBy(f)
[[6,100],[190,200],[20]]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐