【问题标题】:List Sort how to sort the list列表排序 如何对列表进行排序
【发布时间】:2021-02-08 00:38:55
【问题描述】:

我正在尝试对我正在查看的page 列表进行排序,但我不知道为什么我的代码不起作用。我收到以下错误。

(41:21) 没有给出与所需参数相对应的参数 'List.Sort(int, int, IComparer)'

online compiler

我正在尝试和那个年纪大的人做同样的事情,但我正在做排名。我不明白我哪里出错了。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;




class PlayerA{
    public PlayerA(){
        playerID = sID++;
    }
    static int sID = 0;
    public int playerID = 0;
    public List<PlayerA> ignore = new List<PlayerA>();
    public int rank = 0;
}





namespace Rextester{
    public class Program{
        public static void Main(string[] args){
            List<PlayerA> li = new List<PlayerA>();
            PlayerA[] pl = new PlayerA[10];
            for(int i=0; i<10; i++){
                pl[i] = new PlayerA();
                pl[i].rank = i*2;
            }
            pl[0].rank = 20;
            pl[1].rank = 15;
            for(int i=0; i<10; i++){
                li.Add(pl[i]);
            }
            
            li = li.Sort((pl[0], pl[1]), pl[0].rank.CompareTo(pl[1].rank));
            
            for(int i=0; i<10; i++){
                Console.WriteLine(pl[i].rank);
            }
        }
    }
}

我也试过了

li.Sort( (pl[0],pl[1])=>pl[0].rank.CompareTo(pl[1].rank) );

但我明白了:

(40:35) 语法错误,应为“,” (40:37) 语法错误,应为“,”

如果我做

li.Sort( (pl,pl[0])=>pl.rank.CompareTo(pl.rank) );

如果我重新移动 1 [],我会得到相同的结果:

li.Sort( (pl,pl)=>pl.rank.CompareTo(pl.rank) );

我明白了:

(42:23) A local or parameter named 'pl' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter
(42:26) The parameter name 'pl' is a duplicate
(42:31) Ambiguity between 'PlayerA' and 'PlayerA'
(42:49) Ambiguity between 'PlayerA' and 'PlayerA'

我这里完全是瞎子我不明白这个功能的基础知识

li.Sort( (x,y)=>x.rank.CompareTo(y.rank) );

我不明白 x 或 y 是什么它不是 pl 它不是 pl[] 它是什么我不明白

好吧,只是为了好玩,我把它当作 x 和 y 而不是其他任何东西,它编译了所以它应该可以工作,我不明白为什么它编译但是好的,......现在问题是它没有排序

online compiler new codewitch 不排序但编译问题出在哪里

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;




class PlayerA{
    public PlayerA(){
        playerID = sID++;
    }
    static int sID = 0;
    public int playerID = 0;
    public List<PlayerA> ignore = new List<PlayerA>();
    public int rank = 0;
}





namespace Rextester{
    public class Program{
        public static void Main(string[] args){
            
            List<PlayerA> li = new List<PlayerA>();
            PlayerA[] pl = new PlayerA[10];
            for(int i=0; i<10; i++){
                pl[i] = new PlayerA();
                pl[i].rank = i*2;
            }
            pl[0].rank = 20;
            pl[1].rank = 15;
            for(int i=0; i<10; i++){
                li.Add(pl[i]);
            }
            
            li.Sort( (x,y)=>x.rank.CompareTo(y.rank) );
            
            for(int i=0; i<10; i++){
                Console.WriteLine(pl[i].rank);
            }
            
        }
    }
}

【问题讨论】:

  • 我假设您在谈论 C#,请考虑使用适当的语言和主题标记您的问题
  • 嗯,我确实标记了它 c#,列出和排序

标签: c# list sorting


【解决方案1】:

尝试使用 same 表达式作为链接答案:

li.Sort( (x,y)=>x.rank.CompareTo(y.rank) );

您发布的代码:

li = li.Sort((pl[0], pl[1]), pl[0].rank.CompareTo(pl[1].rank));

与链接的答案完全不同。链接的答案使用 lambda 形式的 function (delegate) 比较名为 xy 的两个参数:

(x, y) => x.Age.CompareTo(y.Age)

List.Sort 也不返回任何内容,因为它会对列表进行就地排序。

您发布的内容试图将(PlayerA,PlayerS) 元组和int 传递给Sort。如果您将每个参数写在单独的行上,您发布的是:

li = li.Sort(
    (pl[0], pl[1]), 
    pl[0].rank.CompareTo(pl[1].rank)
);

(pl[0], pl[1]) 是一个包含列表前两个元素的元组。 pl[0].rank.CompareTo(pl[1].rank 返回比较两个特定列表项的结果。没有Sort 重载接受这样的参数。错误告诉你编译器找不到任何匹配的函数,最接近的匹配缺少一些参数

更新

以下代码:

var list=Enumerable.Range(0,10).Select(i=>new PlayerA{Rank=i*2}).ToList();
list[0].Rank=20;
list[1].Rank=15;
Console.WriteLine(String.Join(",",list.Select(x=>x.Rank)));

list.Sort((x,y)=>x.Rank.CompareTo(y.Rank));
Console.WriteLine(String.Join(",",list.Select(x=>x.Rank)));

打印:

20,15,4,6,8,10,12,14,16,18
4,6,8,10,12,14,15,16,18,20

这个dotNetFiddle snippet可以用来运行代码并重现结果

【讨论】:

  • li.Sort( (pl[0],pl[1])=>pl[0].rank.CompareTo(pl[1].rank) );应该这样做,但问题是我得到:(40:35)语法错误,','预期(40:37)语法错误,','预期
  • 不,不应该。您继续使用 array items 而不是参数名称。您是否尝试过使用答案的代码?
  • 好的,我确实复制了它并编译了它,但它没有整理出来我仍然不明白它为什么编译它
  • @MilitaryG 你试过在排序前后打印出列表项吗? List.Sort 有效。我发布了一个示例,显示列表 is 已排序。
  • 新代码刚刚更新了问题
猜你喜欢
  • 1970-01-01
  • 2014-06-21
  • 2012-12-16
  • 1970-01-01
  • 2010-11-18
  • 2015-03-05
  • 1970-01-01
  • 2023-04-06
相关资源
最近更新 更多