在列表中创建范围

问题描述 投票:0回答:3

我的价目表为

10
21
30
90
100
150
400

我想以低于100的10增量添加价格。高于100以100的增量显示价格

所以我的最终价格清单会是

10
20
30
40
50
60
70
80
90
100
200
300
400

有没有人做过类似的事情。任何帮助或建议,将不胜感激。

提前感谢

c# list range price enumerable
3个回答
0
投票

我相信以下程序可以根据您的需要进行工作:

using System;
using System.Linq;

namespace csharp
{
    class Program
    {
        static void Main(string[] args)
        {
            var prices = new int[]{10, 21, 30, 90, 100, 150, 400}.ToList();
            var finalPriceList =
                Enumerable
                .Range(0, 10)
                .Select(i => prices.Min() + 10 * i)
                .TakeWhile(i => i < Math.Min(100, prices.Max()))
                .Concat(
                    Enumerable
                    .Range(1, 1000)
                    .Select(i => 100 * i)
                    .TakeWhile(i => i <= prices.Max())
                ).ToList();
            Console.WriteLine(string.Join(", ", finalPriceList));
        }
    }
}

它打印:

10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400

0
投票

关于是否要生成'n'个元素或是否要生成直到列表中的最大值尚不明确。

情况1:如果生成直到列表中的最大值

public IEnumerable<int> Generate(int maxValue)
{
    var currentValue = 0;
    while(currentValue<maxValue)
    {
        currentValue += currentValue < 100 ? 10:100;
        yield return currentValue;
    }
}

您现在可以将方法用作

var myList = new List<int>(new int[] { 12, 21, 30, 90, 100, 150, 404 });
var result = Generate(myList.Max());

情况2:当您要生成N个元素时。

var initialValue = 0;
var list = Enumerable.Range(1,totalNumberOfExpectedItems)
                     .Select(x=> 
                       { 
                          initialValue = initialValue < 100 ? initialValue + 10 : initialValue + 100; 
                          return initialValue;
                       })

Enumerable.Range有助于在指定范围内生成序列

对于totalNumberOfExpectedItems = 13

输出

10 
20 
30 
40 
50 
60 
70 
80 
90 
100 
200 
300 
400 

0
投票

尝试一下...

我假设您正在获得列表中最低值和最高值之间的所有值。

List<int> myList = new List<int>(new int[] { 12, 21, 30, 90, 100, 150, 404 });
int max = myList.Max() - myList.Max() % 100;
int min = myList.Min() - myList.Min() % 10;

int tmp = (int)Math.Round(Math.Log10(min), MidpointRounding.ToZero);
List<int> newList = new List<int>();
for (int a = tmp, b = min / (int)Math.Pow(10, tmp); (Math.Pow(10, a) * b <= max); )
{
     newList.Add((int)(Math.Pow(10, a) * b));
     if (b < 9) b++;
     else
     {
         b = 1;
         a++;
     }
}

//newList : [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400]
© www.soinside.com 2019 - 2024. All rights reserved.