我正试图对基于2列的LINQ数据表进行排序。我想按
排序- 日期列第一
- 分类栏第二列,并在这一列中自定义排序:这里我有&;altele&;; ingrasaminte&;;;杀虫剂&;;;seminte&;;; motorina&;。我想要的顺序是"英格拉森","马达","杀虫剂","半成品"。和";Altele"最后。
这是我目前看到的:(From x In dataTable.AsEnumerable() Order By Convert.ToString(x("Date")), Convert.ToString(x("Category")) Select x).CopyToDataTable
这就把">
DataTable例子
Date Category TURN INTO => Date Category
21.05.2022 Altele 21.05.2022 Ingrasaminte
22.05.2022 Altele 21.05.2022 Motorina
21.05.2022 Pesticide 21.05.2022 Pesticide
22.05.2022 Pesticide 21.05.2022 Seminte
21.05.2022 Ingrasaminte 21.05.2022 Altele
22.05.2022 Ingrasaminte 22.05.2022 Ingrasaminte
21.05.2022 Motorina 22.05.2022 Motorina
22.05.2022 Motorina 22.05.2022 Pesticide
21.05.2022 Seminte 22.05.2022 Seminte
22.05.2022 Seminte 22.05.2022 Altele
你能帮个忙吗?
首先您必须创建一个自定义的Comparer
类
class Comparer : IComparer<string>
{
public static Comparer Instance = new Comparer();
public int Compare(string x, string y)
{
if (x == "Altele" && y != "Altele")
{
return 1;
}
if (x != "Altele" && y == "Altele")
{
return -1;
}
return string.Compare(x, y);
}
}
然后对数据表应用以下Linq查询
OrderBy(r => r.Date).ThenBy(r => r.Category, Comparer.Instance)
下面的测试代码来自我的控制台项目。我在数据集设计器中创建了DataSet1
类,DataTable1
类具有Date
和Category
列。
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp2
{
class Program
{
class Comparer : IComparer<string>
{
public static readonly Comparer Instance = new Comparer();
public int Compare(string x, string y)
{
if (x == "Altele" && y != "Altele")
{
return 1;
}
if (x != "Altele" && y == "Altele")
{
return -1;
}
return string.Compare(x, y);
}
}
static void Main(string[] args)
{
DataSet1 dataSet1 = new DataSet1();
var format = "dd.MM.yyyy";
var data =
@"21.05.2022 Altele
22.05.2022 Altele
21.05.2022 Pesticide
22.05.2022 Pesticide
21.05.2022 Ingrasaminte
22.05.2022 Ingrasaminte
21.05.2022 Motorina
22.05.2022 Motorina
21.05.2022 Seminte
22.05.2022 Seminte".Split(new string[] { "r", "n", " " }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < data.Length; i += 2)
{
dataSet1.DataTable1.AddDataTable1Row(DateTime.ParseExact(data[i], format, null), data[i + 1]);
}
Console.WriteLine(dataSet1.DataTable1.Select(r => $"{r.Date.ToString(format)}t{r.Category}").Aggregate((a, b) => $"{a}n{b}"));
var array = dataSet1.DataTable1.OrderBy(r => r.Date).ThenBy(r => r.Category, Comparer.Instance).ToArray();
Console.WriteLine();
Console.WriteLine(array.Select(r => $"{r.Date.ToString(format)}t{r.Category}").Aggregate((a, b) => $"{a}n{b}"));
Console.ReadKey();
}
}
}