【问题标题】:Sort List of comma separated, pipe delimited records逗号分隔、竖线分隔记录的排序列表
【发布时间】:2020-08-25 09:01:37
【问题描述】:

我有一个列表,其中列表中的每个项目都由两个字符串和一个以逗号分隔的整数组成,列表的结构如下:

Category, Subcategory, count
Category, Subcategory, count

这是我未排序列表的简化版本:

Honda, Accord SE, 322 
Honda, Civic, 69 
Real Estate Service,Yes, 701 
Honda, Ridgeline, 47 
Honda, Accord SE, 238 
Real Estate Service,No, 54

我可以对我的列表进行排序:someList.Sort()

这将按类别、子类别对列表进行排序,然后按升序对每个项目进行计数。

有没有办法按类别然后按计数对列表进行排序?

如果两个类别和子类别相同,则保留计数最多的一个并删除其他?

我见过这样的例子,其中每条记录都可以是一个具有 Category、Subcategory 和 Count 属性的类,以及一个用于比较记录或使用 LINQ/Lambda 表达式的 compare 方法,但有没有更简单的方法来做到这一点?

【问题讨论】:

  • 你能上传你的代码/数据结构的简化版本吗?
  • 这是我未排序列表的简化版本:本田、雅阁 SE、322
  • 这是我未排序列表的简化版本:本田,雅阁 SE,322 本田,思域,69 房地产服务,是的,701 本田,Ridgeline,47 本田,雅阁 SE,238 房地产服务,不,54

标签: c# list sorting


【解决方案1】:

您可以使用LINQ 及其OrderByThenByOrderByDescendingThenByDescending 方法:

var list = new List<string>()
{
    // category, subcategory, count
    "A,Z,3",
    "B,Y,2",
    "C,X,1"
};

// ascending order
var orderedListAsc = list.OrderBy(x => x.Split(',')[0]) // order by category
                        .ThenBy(x => x.Split(',')[2])  // then order by count
                        .ToList();

// descending order
var orderedListDesc = list.OrderByDescending(x => x.Split(',')[0])
                         .ThenByDescending(x => x.Split(',')[2])
                         .ToList();

正如 Mark Balhoff 在 cmets 中指出的那样,您可能希望在任何排序完成之前将 count 值转换为整数,否则它只会比较字符串值。

.ThenBy(x => int.Parse(x.Split(',')[2]))

【讨论】:

  • 您不需要将计数转换为数字才能正确排序吗?
  • 是的,你是对的。谢谢你指出这一点。我编辑了我的答案。 :)
  • 就是这样!谢谢...非常感谢。
  • 其实,这就是我需要的(只是一个小调整):var proposalsSorted = proposals.OrderBy(x =&gt; x.Split(',')[0]) .ThenByDescending(x =&gt; int.Parse(x.Split(',')[2])) .ToList(); 谢谢!非常感谢。
猜你喜欢
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
相关资源
最近更新 更多