【问题标题】:Sort same value fields in list descending对列表中的相同值字段进行降序排序
【发布时间】:2011-11-15 17:31:32
【问题描述】:

如何按降序对通用列表中的相同值字段进行排序。

例子:

List<int> objList = new List<int>();

objList.Add(1);
-> objList.Add(0);
-> objList.Add(0);
objList.Add(2);
-> objList.Add(0);

不知何故这是我的来源,我想以降序模式对例如零值进行排序。

我使用此代码对数字进行排序(实际上是深度),上面的示例与此无关,但不知何故它是相同的。在我的通用列表中,我有几个深度,它们可能彼此相同,我想对相同的字段进行降序排序。

Objects.Sort(
   delegate(Classes.Object.GameObject Object1, Classes.Object.GameObject Object2)
   {
       return Object1.Depth.CompareTo(Object2.Depth);
   }
);

答案:将来可能会帮助某人

    // Reverse same oredered
    CurrentSameOrderedFind = Objects[0].Depth;
    CurrentSameOrderedID = 0;
    for (int i = 1; i <= Objects.Count - 1; i++)
    {
        if (Objects[i].Depth != CurrentSameOrderedFind)
        {
            SameOrederedFound = true;
            Objects.Reverse(CurrentSameOrderedID, i - 1);
            CurrentSameOrderedFind = Objects[i].Depth;
            CurrentSameOrderedID = i;
        }
    }
    if (!SameOrederedFound)
    {
        Objects.Reverse();
    }

【问题讨论】:

  • 你的问题很不清楚。例如,“上面的例子与此无关,但不知何故它是相同的”——这是什么意思?如果您能更清楚地解释问题,我们更有可能为您提供帮助。
  • :) 我不知道我应该扩展多少。很简单,按降序对相同值的字段重新排序。就像你有(Field[0] = 0, Field[1] = 1, Field[2] = 0) 然后结果应该是(Field[2], Field[0], Field[1]); 简单!
  • 不,一点都不容易——“相同值的字段”到底是什么意思?如果你能给出一个简短但完整的例子来展示你的输入和期望的输出,那真的很有帮助。

标签: c# list


【解决方案1】:

要对上面的代码显示的List&lt;int&gt; 进行排序,按降序排列,有一个非常简单的 Linq 解决方案:objList = objList.OrderByDescending(i =&gt; i).ToList();

通过阅读您的问题的其余部分,您想对具有深度属性的对象列表进行排序吗?如果是这样,这应该适合你:

var myList = new List<someTypeWithDepth>();
myList = myList.OrderByDescending(o => o.depth).ToList();

如果您在任何情况下使用这些列表,您都可以将它们输入为IEnumerable&lt;T&gt; 而不是List&lt;T&gt;,那么您可以删除那些丑陋的ToList() 调用

【讨论】:

  • OrderByDescending 调用(与所有 LINQ 一样)不会对 List 进行排序,它们会将有序数据作为 IOrderedEnumerable 返回
  • 拍得好!我会试试看。但是 Aron Mclver 说了什么?
  • @MahanGM - Aaron 指出了我的代码中的一个小错误。现在应该修好了。
【解决方案2】:

如果我对您的理解正确,您希望您的列表根据GameObject.Depth 按降序排序,并且您有一个对您的集合进行排序的实现,但按升序而不是降序排列。鉴于此,这是我能想到的最懒惰的答案:

根据我的评论编辑了代码。真的,为什么你不能在问题中说出你想要的?我同意这并不复杂,但是如果您不提出好的问题,您将无法获得好的帮助。

   List<GameObject> oldList = new List<GameObject>(Objects); 
   Objects.Sort( 
       delegate(Classes.Object.GameObject Object1, Classes.Object.GameObject Object2) 
       { 
           int compareValue = -1 * Object1.Depth.CompareTo(Object2.Depth); 
           if(compareValue == 0)
               compareValue = oldList.IndexOf(Object2).CompareTo(oldList.IndexOf(Object1));
           return compareValue;
       } 
    ); 

几乎不是最优的,但它不是注定的。

【讨论】:

  • @MahanGM - 然后你需要一个额外的属性来比较,至少对于你已经使用的delegate 语法,你还没有指定一个。我将编辑我的答案,使用列表索引作为该属性(按降序排列,如果它们都具有相同的深度,则 list[0] 出现在 list[1] 之后),因为我有一个偷偷摸摸的怀疑这就是你想要的,因为不管是什么原因,根据你的问题的 cmets。
  • 我做过 但是有一些问题他们问了那么几次,他们没有明确的意思!。关于更新的代码,它看起来不错,但它只关心零值吗?相同的值可以是任意数字。
  • @MahanGM - 此代码将首先根据Depth(较高值在前)然后根据先前的索引值(再次,最高值在前)对您的列表 (Objects) 进行排序。因此,如果 Objects = { A, B, C, D } 具有相应的深度值 { 1, 0, 2, 0 },则排序结果将是 { C, A, D, B }。如果您希望先低深度但仍要先使用最高索引 - 即结果 { D, B, A, C } - 只需删除 -1 *。
  • 现在这就是我所说的 1 小时!谢谢。我会把你的名字记在我的信用里:)
猜你喜欢
  • 2021-08-09
  • 1970-01-01
  • 2021-12-19
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2016-10-18
相关资源
最近更新 更多