【问题标题】:Sort a list in C# by range and sameness在 C# 中按范围和相同性对列表进行排序
【发布时间】:2021-06-08 17:04:24
【问题描述】:

我有很多硬件零件,其中每个零件都有名称和销量。

样本集合如下:

var parts = new List<(string name, int sales)>{
    ("Part A", 400),
    ("Part B", 600),
    ("Part A", 600),
    ("Part C", 400),
    ("Part D", 1500),
    ("Part B", 500),
    ("Part A", 475),
    ("Part B", 400),
    ("Part E", 700),
    ("Part A", 700),
};

此零件列表首先按销量排序:

var results = parts.OrderByDescending(p => p.sales).ToList();
/*
Results:

Part D - 1500 
Part E - 700 
Part A - 700 
Part B - 600 
Part A - 600 
Part B - 500 
Part A - 475 
Part A - 400 
Part C - 400 
Part B - 400 
*/

现在,我需要的第二个订单是将相同的零件名称放在一起,只要它们的销售额在彼此相差 100 的范围内,但保持第一个订单不变。

/*
Final results:

Part D - 1500 
Part E - 700 
Part A - 700 
Part A - 600 
Part B - 600 
Part B - 500 
Part B - 400 
Part A - 475 
Part A - 400 
Part C - 400
*/

如何以有效的方式实现这一点,使其在大型数据集上也表现良好?

【问题讨论】:

标签: c#


【解决方案1】:

这取决于“大型数据集”的含义。

var parts = new List<(string Name, int Sales)?>{
    ("Part A", 400),
    ("Part B", 600),
    ("Part A", 600),
    ("Part C", 400),
    ("Part D", 1500),
    ("Part B", 500),
    ("Part A", 475),
    ("Part B", 400),
    ("Part E", 700),
    ("Part A", 700),
};

parts = parts.OrderByDescending(p => p.Value.Sales).ToList();

List<(string Name, int Sales)> sortedParts = new();

for (int i = 0; i < parts.Count; i++)
{
    if (parts[i] is not null)
    {
        sortedParts.Add(parts[i].Value);

        for (int j = i+1; j < parts.Count; j++)
        {
            if (parts[j] is not null && parts[i].Value.Name == parts[j].Value.Name 
                && parts[j].Value.Sales >= sortedParts.Last().Sales - 100
                && parts[j].Value.Sales <= sortedParts.Last().Sales + 100)
            {
                sortedParts.Add(parts[j].Value);
                parts[j] = null;
            }
        }
    }
}

【讨论】:

  • 谢谢克拉姆西。巧妙地使用可空值类型元组。适用于大多数场景。我会再测试一下。
【解决方案2】:

这能解决吗?

var results = parts
   .OrderByDescending(p => Math.Floor(p.sales/100))
   .ThenBy(p => p.name)
   .ToList();

【讨论】:

  • 谢谢马蒂亚斯。不幸的是,它不会将范围内的相同部件名称组合在一起。
猜你喜欢
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 2016-11-15
  • 2010-12-01
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
相关资源
最近更新 更多