我如何从列表字符串中获取最高整数

How can i get the highest integer from a list string

我有一个视频剪辑,其中包含一堆元数据(主要是单行字符串),这些元数据又链接到特定的帧。我设法从元数据的每一行中分离出速度数据并将其存储在另一个列表中 lc4_highest_speed_2

     for (int h = 0; h < lc4_file_calculations.Count; h++)
                    {
     string hold_variable = lc4_file_calculations[h].Replace("-", ",");
     var mySplitResult2 = hold_variable.Split(',');
                            var speed = mySplitResult2[mySplitResult2.Length - 45];
                             lc4_highest_speed.Add(speed + ":" + h);
    }

for (int f = 0; f < lc4_highest_speed.Count; f++)
                {
 string hoe3 = lc4_highest_speed[f];
                    var mySplitResult3 = hoe3.Split(':');
                    var speed2 = mySplitResult3[mySplitResult3.Length - 2];
                    var speed3 = mySplitResult3[mySplitResult3.Length - 1];
                    string speed_test = speed2.ToString();
                        lc4_highest_speed_2.Add(speed2 + " - " + speed3);
}

新列表包含这样的数据 012 - 82 - 之前的第一部分是速度,另一部分是与另一个字符串中的值相关的索引号。我已经尝试过像 concat 这样的东西,但是它没有用。获得 - 之前的元素的最高速度的最佳方法是什么,同时还要保持索引号与 - 之后的数字的关系。

谢谢

尝试以下操作:

           string[] input = {
                                 "012 - 82",
                                 "012 - 83",
                                 "012 - 84",
                                 "012 - 85",
                                 "012 - 86",
                                 "012 - 87",
                                 "13 - 102",
                                 "13 - 103",
                                 "13 - 104",
                                 "13 - 105",
                                 "13 - 106"
                             };

            var output = input
                .Select(x => x.Split(new char[] { '-' }))
                .Select(x => new { speed = int.Parse(x.First()), index = int.Parse(x.Last()) })
                .OrderByDescending(x => x.speed)
                .GroupBy(x => x.speed)
                .First()
                .ToList();

您可以将所有速度值存储在整数列表中,您可以在其中找到 mx 值并使用其索引,然后您可以找到速度与索引值之间的关系。

为了参考,我制作了小程序。希望你会理解

    using System;
     using System.Collections.Generic;
     using System.Linq;

     class HelloWorld {
     static void Main() {
      
      List<string> data = new List<string>();
      List<int> intdata = new List<int>();
      data.Add("012 - 82");
      data.Add("013 - 102");
      for(int i=0;i<data.Count;i++){
         intdata.Add(Int16.Parse(data[i].Substring(0,data[i].IndexOf("-"))));
      }
    Console.WriteLine(intdata.Max());
    }
  }

O(n) 时间复杂度的解决方案return 具有较高索引值的较高速度值。

int highestSpeed = 0;
int indexNumber = 0;

foreach (var item in lc4_highest_speed_2)
{
   var values = item.Split('-');
   if (values?.Count() == 2)
   {
       int.TryParse(values[0], out int parsedValue);
       if (parsedValue > highestSpeed)
       {
           highestSpeed = parsedValue;
           int.TryParse(values[1], out indexNumber);
           continue;
       }

       int.TryParse(values[1], out int parsedIndex);
       if (highestSpeed == parsedValue && parsedIndex > indexNumber) indexNumber = parsedIndex;
   }
}

另一种方法:

var maxSpeed = lc4.Max(x => Convert.ToInt32(x.Split(' ')[0]));
var maxLine = lc4.FirstOrDefault(x => x.StartsWith($"{maxSpeed} "));
var maxIndex = Convert.ToInt32(maxLine.Split('-')[1].Substring(1));

或者如果您想要所有索引:

var maxSpeed = lc4.Max(x => Convert.ToInt32(x.Split(' ')[0]));
var maxLines = lc4.Where(x => x.StartsWith($"{maxSpeed} "));
var maxIndexes = maxLines.Select(x => Convert.ToInt32(x.Split('-')[1].Substring(1)));

您可以利用元组来执行此操作。元组根据实现 IComparable<T> 的成员自动定义顺序。 (比较是按照声明元组成员的顺序进行的。)

由于 int 实现了 IComparable<T> 如果我们构造一个元组,第一个元素是整数速度,第二个元素是整数索引,那么为元组生成的比较操作将正是你需要。

因此,您可以使用 Linq 表达式解决此问题,该表达式将每一行拆分为速度和索引字符串,将这些字符串解析为整数并为每对速度和索引创建一个元组。然后你可以使用 IEnumerable.Max():

找到最大的
var max = lc4_highest_speed_2.Select(item =>
{
    var elements = item.Split("-");
    return (speed: int.Parse(elements[0].Trim()), index: int.Parse(elements[1].Trim()));
}).Max();

请注意,max 是一个元组,其第一个元素为 speed,第二个元素为 index

Try it on .Net Fiddle