所以比较这些id的规则是:
- 如果一个 id 的年份大于另一个,则认为该 id 更大。
- 如果年份相等但一个 id 的月份大于另一个,则认为该 id 更大。
- 如果年份和月份相同,但一个 id 的日期大于另一个,则认为该 id 更大。
- 如果年、月、日相等,但一个 id 的递增部分大于另一个,则认为该 id 更大。
所以现在我们只需要将 id 的值分成 4 个部分,然后我们就可以进行适当的比较了:
- 年份部分,即
Substring(4, 2)
- 月份部分,即
Substring(2, 2)
- 白天部分,即
Substring(0, 2)
- 递增数字部分,即
Substring(7)
这是实现此目的的一种方法,即创建一个实现IComparer<Item> 的类(其中Item 是您的类)。注意:此答案假定您的 id 列是 string,因为您是通过将不同的值连接在一起来创建它的。如果它不是字符串,那么参数应该是int 值,并且需要先在方法内转换为字符串:
public class ItemComparer : IComparer<Item>
{
public int Compare(Item x, Item y)
{
return Compare(x?.Id, y?.Id);
}
private int Compare(string first, string second)
{
// Rudimentary argument validation - this could be improved
// Null check - consider null as less than non-null
if (first == null) return second == null ? 0 : -1;
if (second == null) return 1;
// Number check - if fails, return string comparison
if (!first.All(char.IsDigit) || !second.All(char.IsDigit))
return first.CompareTo(second);
// Length check - if fails, return int comparison
if (first.Length < 7 || second.Length < 7)
return int.Parse(first).CompareTo(int.Parse(second));
// Compare years
var result = int.Parse(first.Substring(4, 2))
.CompareTo(int.Parse(second.Substring(4, 2)));
if (result != 0) return result;
// Compare months part
result = int.Parse(first.Substring(2, 2))
.CompareTo(int.Parse(second.Substring(2, 2)));
if (result != 0) return result;
// Compare days part
result = int.Parse(first.Substring(0, 2))
.CompareTo(int.Parse(second.Substring(0, 2)));
if (result != 0) return result;
// Compare incrementing number part
return int.Parse(first.Substring(6)).CompareTo(int.Parse(second.Substring(6)));
}
}
现在我们有了这个方法,我们可以通过id 订购一个项目列表。举个例子,让我们从一个简单的类开始:
public class Item
{
public string Id { get; set; }
public string Value { get; set; }
}
我们可以填充这些项目的列表并使用我们的比较器类对它们进行排序:
public static void Main(string[] args)
{
var items = new List<Item>
{
// Second-most oldest item on Oct. 14, 2018
new Item {Id = "14101801", Value = "Second"},
// Fifth-most oldest item on Nov. 14, 2019
new Item {Id = "14111901", Value = "Fifth"},
// First-most oldest item on Oct. 13, 2018
new Item {Id = "13101801", Value = "First"},
// Fourth-most oldest item on Nov. 14, 2018 (id 02)
new Item {Id = "14111802", Value = "Fourth"},
// Third-most oldest item on Nov. 14, 2018 (id 01)
new Item {Id = "14111801", Value = "Third"},
};
// Order our items by Id:
items = items.OrderBy(i => i, new ItemComparer()).ToList();
// Output our results
items.ForEach(Console.WriteLine);
GetKeyFromUser("\nDone! Press any key to exit...");
}
输出