代码之家  ›  专栏  ›  技术社区  ›  mr_blond

如何删除列表中的每个n项,直到列表中。计数超过目标值?

  •  -1
  • mr_blond  · 技术社区  · 7 年前

    有一张短名单。它的价值并不重要,比如:

    List<short> resultTemp = new List<short>{1,2,3,4,5,6,7,8,9...};
    

    此代码应该通过从结果列表中删除每个第n项来减少结果列表计数。

    例1:

    List<short>{1,2,3,4,5,6,7,8,9,10}.Count == 10;
    var targetItemsCount = 5;
    

    结果应为1,3,5,7,9且结果。计数应为==5

    例2:

    List<short>{1,2,3,4,5,6,7,8,9}.Count == 9;
    var targetItemsCo:nt = 3;
    

    结果应为1,4,7且结果。计数应为==3

    但它应该停止删除它,在某个地方使结果计数等于targetItemsCount(在这段代码中是42,但它的其他值并不重要)。 代码是:

    var currentItemsCount = resultTemp.Count;
    
    var result = new List<short>();
    
    var targetItemsCount = 42;
    var counter = 0;
    var counterResettable = 0;
    
    if (targetItemsCount < currentItemsCount)
    {
        var reduceIndex = (double)currentItemsCount / targetItemsCount;
    
        foreach (var item in resultTemp)
        {
            if (counterResettable < reduceIndex || 
                result.Count + 1 == currentItemsCount - counter)
            {
                result.Add(item);
                counterResettable++;
            }
            else
            {
                counterResettable = 0;
            }
            counter++;
        }
    }
    

    在本例中,result.count等于41,但应为==TargetItemsCount==42;

    我该如何删除列表中的每一个n项,直到全部删除。用c比目标值多计数?

    3 回复  |  直到 7 年前
        1
  •  0
  •   vc 74    7 年前

    double increment = Convert.ToDouble(resultTemp.Count) / targetItemsCount;
    
    List<short> result = Enumerable.Range(0, targetItemsCount).
                                    Select(x => resultTemp[(int)(x * increment)]).
                                    ToList();
    

    List<short>{1,2,3,4,5,6,7,8,9}.Count == 9;
    var targetItemsCount = 6;
    

    [1, 2, 4, 5, 7, 8]

    targetItemsCount > 0 targetItemsCount < resultTemp.Count

    Link to Fiddle

        2
  •  1
  •   xdtTransform    7 年前

    public static void run()
    {
        var inputs =
            new List<Input>{
              new Input{ 
                  Value = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 },`
                  TargetCount = 5, ExpectedOutput= new List<int>{1,3,5,7,9} 
              },
              new Input{  
                  Value = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 },
                  TargetCount = 3, ExpectedOutput= new List<int>{1,4,7} 
              },
            };
    
        foreach (var testInput in inputs)
        {
            Console.WriteLine($"# Input = [{string.Join(", ", testInput.Value)}]");
            var result = Reduce(testInput.Value, testInput.TargetCount);
            Console.WriteLine($"# Computed Result = [{string.Join(", ", result)} ]\n");
        }
    }
    
    static List<int> Reduce(List<int> input, int targetItemsCount)
    {
        while (input.Count() > targetItemsCount)
        {
            var nIndex = input.Count() / targetItemsCount;
            input = input.Where((x, i) => i % nIndex == 0).ToList();
        }
        return input;
    }
    
    class Input
    {
        public List<int> ExpectedOutput;
        public List<int> Value;
        public int TargetCount;
    }
    



        3
  •  0
  •   Rand Random    7 年前

    var resultTemp = Enumerable.Range(1, 9).ToList();
    var targetItemsCount = 3;
    
    var roundingError = resultTemp.Count % targetItemsCount;
    var reduceIndex   = (resultTemp.Count - roundingError) / targetItemsCount;
    
    List<int> result;
    if (reduceIndex <= 1)
        result = resultTemp.Take(targetItemsCount).ToList();
    else
        result = resultTemp.Where((a, index) => index % reduceIndex == 0).Take(targetItemsCount).ToList();
    

    42 1 100 2nd 83