【问题标题】:Get certain element range in a List<long> based on some conditions根据某些条件获取 List<long> 中的某些元素范围
【发布时间】:2015-11-23 03:11:29
【问题描述】:
  • 我有 2 个 List&lt;long&gt;valueCovvalueWat)和 long 数据类型值。
  • 当找不到某个列表元素时,我需要获取下一个 与搜索值差异最小的更接近的元素。

为此:

  • 我正在遍历 valueWat 的元素 (x),如果没有确切的 在valueCov 中匹配它,然后进入我需要找到的其他部分 最接近“x”的元素。

  • 我需要一种解决方案/方法来从中找到最接近的下一个元素 List.

代码段:

foreach (var y in sortedCov){
                    valueCov.Add(y.Value);
                }
                //Console.WriteLine("initial" + valueCov.Count);
                foreach (var x in valueWat){
                    //foreach (var y in valueCov){
                       // var keys = new List<long>(y.Value);
                            int index = valueCov.BinarySearch(x);
                            int lower;
                            int upper;
                                if (index >= 0) {
                                  lower = upper = index;
                                  blockedWaterCoverMap.Add(x, valueCov[index]);
                                  valueCov.RemoveAt(index);
                                                }
                                else  {
                                    //foreach (var y in valueCov){
                                        //subListCov = valueCov.FindAll((y < x + 7) && (y > x - 7));
                                       // }

                                      }

【问题讨论】:

    标签: list search c#-4.0


    【解决方案1】:

    如果我理解正确你想要这样的功能:

    int FindClosest(long data) {
            int i = 0; // index of currently checked element from valueCov
            int index = i; // returned index of the closest element 
            // here is current lowest distance to searched value:
            long min = long.MaxValue; 
            // currently counted difference between input value
            // and the next element of the list valueCov
            long diff = 0; 
            foreach (var elem in valueCov) {
                if ((diff = Math.Abs(elem - data)) <= min) {
                    min = diff;
                    index = i; // the searched index is updated
                }
                i++; 
            }
    
            // random selection of the index from the closest
            // found values
            List<int> indices = new List<int>();
            for (int n = 0; n < valueCov.Length; n++) {
                 if (valueCov[n] == valueCov[index])
                    indices.Add(n);
            }
            Random r = new Random();
            index = indices[r.Next(indices.Count)];
            return index;
    }
    

    希望对您有所帮助。

    【讨论】:

    • 有一个问题。当 valueCov 多次包含相同的值时;比如: valueCov { 25,25,34,34,34,.....} 然后,索引总是指出第一次出现。
    • 我认为这并不重要,因为您正在寻找最接近值的索引。如果您想要最后找到的符合您的条件的索引您可以更改 if 语句以接受相等的值最小化:if ((diff = Math.Abs​​(elem - data))
    • 很好。这里提到的“d”是什么? for (int n = 0; n
    • 对不起,我的错。当然,我的意思是 valueCov,而不是任何 d...variable d 在我的实现中,我正在测试代码是否有效。我已经编辑了答案。
    • 糟糕,我很害怕。当我将返回的值添加到字典中时,仍然出现相同的重复键异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多