【问题标题】:C# Order/Sorting List by String Name - [n]x[n]C# 按字符串名称排序/排序列表 - [n]x[n]
【发布时间】:2021-03-31 10:26:36
【问题描述】:

我有一个需要按名称排序的 C# 列表。名称是棚子的大小,所以这样开始:

  • 4x4 顶棚
  • 20x6 顶棚
  • 10x6 顶棚

当我按名称订购时,它会选择 10x6 作为第一个,但 4x4 应该是第一个。我认为 1 正在被取走,并且是以这种方式订购的。

我有这个:

allProducts = allProducts.OrderBy(x => x.Name).ToList();

按名称排序的最佳方式是什么 - [n]x[n] 并且最有效?

【问题讨论】:

  • 这里的实际规则是什么? 20x6 是在 6x20 之前还是之后?该模式实际上是[a]x[b] 而不是[n]x[n] 那么ab 通常如何排序?
  • 所以您想按 [n] x [m] 的评估值排序?

标签: c# .net asp.net-mvc sorting


【解决方案1】:

它并不是特别“高效”,因为字符串混搭这种事情并不是,但您可以使用正则表达式提取维度并根据您的规则进行排序。假设您的规则是“按区域排序”,即宽度乘以深度:

var regex = new Regex(@"(?<a>\d+)\s*x\s*(?<b>\d+)");
var input = new List<string>
{
    "4x4 Apex Shed",
    "20x6 Apex Shed",
    "10x6 Apex Shed"
};
    
var result = input.OrderBy(x => {
        var match = regex.Match(x);
        var a = int.Parse(match.Groups["a"].Value);
        var b = int.Parse(match.Groups["b"].Value);
        return a * b;
});

现场示例:https://dotnetfiddle.net/SDDJgy

如果您想高效地将数据存储为具有宽度、深度和名称属性的对象并适当地排序,而不是尝试从字符串中解析这些值。

【讨论】:

  • 嗨,看起来很接近,但是当我有这个时: var input = new List { "4x4 Apex Shed", "20x6 Apex Shed", "4x6 Apex Shed", "6x4 Apex Shed ”、“8x6 顶棚”、“8x4 顶棚”、“10x6 顶棚”、“10x4 顶棚”};它也没有排序,8x6 排在 10x4 之后
  • 好的,@NeilHodges 我再问一次 - 排序规则是什么?您只想按第一个维度排序吗?
  • 需要先按第一个维度,再按以下维度。 8x6 应该在 10x4 之前,如果它是第一个维度,它仍然应该在 10 之前将其排序为 8。
猜你喜欢
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 2020-06-22
  • 2018-07-16
相关资源
最近更新 更多