【问题标题】:C# List<T> OrderBy float memberC# List<T> OrderBy 浮动成员
【发布时间】:2014-06-12 14:42:12
【问题描述】:

我有一个包含 A 类实例的列表。

class A
{
   public int Id;
   public float Value;
}

List<A> Collection = new List<A>( ... );

我想使用

对列表进行排序
Collection.OrderBy(item => item.Value);

这应该可以工作,但是对于浮点数,它会打乱顺序。它会产生

1.0, 1.5, 1.6, 10.5, 11.54, 3.4, 4, 6.6, 7

其中 10.5、11.54 应位于列表底部。 如果 Value 是 int,这种方法非常有效。有什么线索吗?

【问题讨论】:

  • Collection.OrderBy 不会修改现有的列表,它会返回一个有序的IEnumerable&lt;T&gt;var newList = Collection.OrderBy(item =&gt; item.Value).ToList() 你会看到有序的列表
  • @Habib,这是正确和最完整的答案。我会支持您的评论,但您应该将其发布为答案。
  • @MarkO,我不确定 OP 的代码是 OP 复制了整行还是一部分。但如果 OP 的问题得到解决,我会很高兴 :)
  • 愚蠢的错误,你是对的@Habib,我必须将排序列表分配回其原始列表Collection = Collection.OrderBy(item =&gt; item.Value).ToList(); 感谢您清除它,您应该回答而不是评论。无论如何投票

标签: c# linq list sorting


【解决方案1】:

不创建新列表:

 Collection.Sort((x,y) => x.Value.CompareTo(y.Value));

【讨论】:

    【解决方案2】:

    试试

    List<A> Collection = new List<A>( ... );    
    List<A> lstOrderedA = Collection.OrderBy(item => item.Value).ToList();
    

    这里lstOrderedA 将有您正在寻找的有序列表。

    【讨论】:

    • 您的回答似乎没有任何投票权。没有downvote,没有Upvote。
    • @Habib 有人对答案投了赞成票,但现在它被删除了。因此,我的问题确实是首先投赞成票的人。我的答案没有改变,所以如果它在 15 分钟前是明智和正确的,为什么不是现在呢?
    • 别担心投票,+1,你的答案是正确的。某个机构刚刚决定撤销赞成票,这种情况发生了。
    • @Habib 我明白了,因为这不是第一次发生。我只是想知道为什么它突然“停止”成为一个好的解决方案的原因?你知道,是什么让它“值得”首先投票,然后不?
    【解决方案3】:

    我使用这个代码:

    List<A> Collection = new List<A>() 
    {
        new A(){Id=1,Value=1.0f},new A(){Id=1,Value=11.5f},new A(){Id=1,Value=1.6f},new A(){Id=1,Value=10.5f}
    };
    List<A> orderedList =  Collection.OrderBy(i =>i.Value).ToList();
    

    它显示 1.0,1.6,10.5,11.5.

    【讨论】:

      【解决方案4】:

      这证明它确实有效:https://dotnetfiddle.net/3ryECS

      但是,Linq 不会更改原始列表,它会返回一个新的排序 IEnumerable&lt;A&gt;

      所以在调用.OrderBy(a =&gt; a.Value) 之后collection 的值保持不变。

      如另一个答案中所述,如果您想更改原始列表,您应该使用Sort

      using System;
      using System.Linq;
      using System.Collections.Generic;
      
      public class Program
      {   
      
          class A
          {
             public int Id;
             public float Value;
          }
      
          public static void Main()
          {
              var collection = new List<A>{
                  new A { Id = 1, Value = 1.0f },
                  new A { Id = 5, Value = 5.0f },
                  new A { Id = 6, Value = 6.0f },
                  new A { Id = 10, Value = 10.0f },
                  new A { Id = 11, Value = 11.0f },
                  new A { Id = -289, Value = -289.0f },
                  new A { Id = 123, Value = 123.0f },
                  new A { Id = 3, Value = 3.0f }
              };
      
              foreach (var a in collection.OrderBy(v => v.Value))
              {
                  Console.WriteLine(a.Value);
              }
          }
      }
      

      哪个输出:

      -289
      1
      3
      5
      6
      10
      11
      123
      

      【讨论】:

        【解决方案5】:

        试试这个:

        List<A> ResultList = Collection.OrderBy(item => item.Value).ToList();
        

        你也可以使用 Linq 查询语法:

        IEnumerable<A> c = from x in Collection
                           orderby x.Value
                           select x;
        

        【讨论】:

        • ToList() 和后续的订单会为您提供List&lt;A&gt;。不是IEnumerable&lt;T&gt;。这甚至不会编译。对于这个非常基本的问题,我们真的需要另一个答案吗?
        • @moez 请详细说明"the LINK seems to be more powerful"?
        • 是的,这个:IEnumerable&lt;A&gt; b = collection.OrderBy(v =&gt; v.Value).ToList(); 编译得很好:)
        • @albertjan 不,这行字面上是IEnumerable&lt;T&gt; b = collection.OrderBy(v =&gt; v.Value).ToList();,它不能编译(除非是通用方法)
        • 是的,这是输入错误,我将其更改为 A 并且 @albertjan 实现了 IEnumerable
        猜你喜欢
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        • 2011-07-13
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        • 2014-12-03
        相关资源
        最近更新 更多