Создайте Диапазоны в списке - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть прайс-лист как

10
21
30
90
100
150
400

Я хочу добавить цены на 10 приращений ниже 100. Выше 100 будет отображаться с шагом 100

Так что мой окончательный прайс-лист будеткак

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

Кто-нибудь сделал что-то подобное этому. Буду признателен за любую помощь или предложения.

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 08 ноября 2019

Я считаю, что следующая программа работает по вашему желанию:

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 голосов
/ 08 ноября 2019

Попробуйте это ...

Я предполагаю, что вы получаете все значения между самым низким и самым высоким значениями в списке.

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]
0 голосов
/ 08 ноября 2019

Существует немного неясности относительно того, хотите ли вы генерировать элементы '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 
...