【问题标题】:Can't sort string list as number? [duplicate]无法将字符串列表排序为数字? [复制]
【发布时间】:2018-11-08 09:35:38
【问题描述】:

我有一个这样的字符串列表

"978.8"
"9600.8"
"97.988"

搜索完所有相关问题后,我尝试使用最常用的方法将列表排序为数字

   var newvalues = new List<string>() {"978.8","97.988","9600.8"};
   newvalues.OrderBy(x => double.Parse(x.Value));

但它总是将列表排序为默认字符串值

"9600.8"
"97.988"
"978.8"

我尝试了其他类型的转换,但仍然没有成功。以前有没有人为此挣扎过?我该如何解决这个问题?

【问题讨论】:

  • 如何分配OrderBy 的结果?你目前的文化是什么?
  • 您的OrderBy 子句应该可以工作。如果没有完整的代码,就不可能找出问题所在。
  • 你没有说明问题出在哪里!您只是向我们提供了输入数据和您获得的结果,但没有说明您如何获得它们。我根本没有为此挣扎,因为it works as expected.
  • 您需要将结果分配给一个新变量。 x.Value 是什么?这是double.Parse(x)
  • 你需要知道OrderBy返回一个值;它不会改变原始列表。因此,您需要将该值分配给一个变量。

标签: c# list linq


【解决方案1】:

List&lt;T&gt;.OrderBy() 不会就地排序,而是返回一个新的有序列表。所以你必须把这个方法调用的结果保存到你的变量中。:

newvalues = newvalues.OrderBy(x => double.Parse(x)).ToList();

【讨论】:

  • 但返回一个新的有序列表 不。它返回一个有序的枚举。
  • right :-) 对于“list”,我指的不是List&lt;T&gt; 类型,而是使用常用口语来表示一系列数据。但是当我在OrderBy() 之后添加.ToList() 调用时,下面的代码清楚地表明了这一点
  • 还是不行:(
  • 代码对我有用。结果是什么? var newvalues = new List() { "978.8", "97.988", "9600.8" }; newvalues = newvalues.OrderBy(x => double.Parse(x, System.Globalization.CultureInfo.InvariantCulture)).ToList(); foreach(var x in newvalues) { Console.WriteLine(x); }
【解决方案2】:

假设你有一个像这样的List&lt;string&gt;

List<string> theStringList = new List<string>() { "978.8", "9600.8", "97.988" };

如果您需要输出仍然是 List&lt;string&gt;,那么您就在正确的轨道上,但正如 cmets 中所解释的,您需要将 OrderBy 返回的值分配给一个变量 因为它实际上并没有改变原始列表。您可以将值分配给List&lt;string&gt; 类型的新变量,如下所示:

var newStringList = theStringList.OrderBy(x => double.Parse(x)).ToList();

或者您可以将值分配给同一个变量,如下所示:

theStringList = theStringList.OrderBy(x => double.Parse(x)).ToList();

但是,如果您希望输出为 List&lt;double&gt;,您可以执行以下操作:

var newDoubleList = theStringList.Select(x => double.Parse(x)).OrderBy(x => x).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 2021-06-11
    相关资源
    最近更新 更多