【问题标题】:Find sub list quickly in C# [duplicate]在C#中快速查找子列表[重复]
【发布时间】:2016-11-21 07:33:13
【问题描述】:

假设我有一个类似的模型类

class Player
{
    String FirstName;
    String LastName;
    String Team;
    int UniformNumber;
    int Height;
}

现在我有了这个类的列表:List Players;

此列表包含一些实例,例如,

Players[0] = new Player(){
    FirstName = "Kobe",
    LastName = "Byrant",
    Team = "Lakers",
    UniformNumber = 24,
    Height = 19}; //...

有没有办法获得一个子 List<Player> 类型列表,其中包含相同的高度和相同的 UniformNumber 球员?

谁能告诉我一种快速完成的方法(假设列表中有 10 000 名玩家)? LINQ 够快吗?谢谢。

[编辑] 在提出问题之前,我使用以下代码:

var subList = new List<Player>();
        foreach (var player in players)
        {
            if (players.Where(p =>
                (p.Height == player.Height) &&
                (p.UniformNumber  == player.UniformNumber )).Count() > 1)
            {
                subList.Add(item);
            }
        }

我可以得到结果,但它真的很慢,所以我想要建议,谢谢。

【问题讨论】:

  • “LINQ 够快吗” - 你需要它有多快?您尝试过使用 LINQ 了吗?
  • LINQ 不会给您带来任何性能提升
  • 你从哪里复制的文本?你的报价全错了。
  • “快速完成” – 为了将所有玩家分组,您必须查看每个玩家。这是您需要做的最少工作量。这对你来说已经太慢了吗?那么就没有办法“快速完成”。您尝试过哪些“慢”解决方案?
  • 令人惊讶的是,有多少人只是吐出 LQ 答案并在他们意识到他们不知道问题是什么时删除...

标签: c# linq


【解决方案1】:

首先你需要公开属性:

class Player
{
    public String FirstName {get;set}
    public String LastName {get;set;}
    public String Team {get;set;}
    public int UniformNumber {get;set;}
    public int Height {get;set}
}

然后你可以像这样通过查询编写一个组:

var result= ls
   .GroupBy (l =>new{l.UniformNumber,l.Height})
   .Select (l =>    
  new{l.Key.Height,l.Key.UniformNumber,Players=l.Select(s=>s).ToList}).ToList();

【讨论】:

  • 那些不是属性——它们是字段。如果它们属性会更好。
  • @JonSkeet:你是对的。我改了
猜你喜欢
  • 2014-07-15
  • 1970-01-01
  • 2022-11-17
  • 2021-08-29
  • 2017-12-18
  • 1970-01-01
  • 2019-05-28
  • 2017-11-29
  • 1970-01-01
相关资源
最近更新 更多