我需要找出如何按预定模式对某些数据进行排序。
让我们说我有一些字符串,代表产品信息,例如。 G。
Product1,红色,70 / n
Product6,蓝色,90 / n
Product3,红色,50 / n
Product9,白色,33 / n
我用逗号分隔符分隔了这些字符串,并将它们存储在不同的数组(名称,颜色,价格)中,然后存储在具有相同列的DataTable中。
我可以使用:按颜色排序创建的行
DataView.sort = "color"
或通过LINQ与
DataRow[] dr = table.Select().OrderBy(u=>u[color]).ToArray();
DataTable sortedtable = dr.CopyToDataTable();
但是,这只是基于字母的简单排序,即asc / desc。
我想实现使用预定义模式的排序。在示例中,物品顺序将由红色,黑色,蓝色,白色的颜色定义。
我能做些简单的事情吗?我认为可以通过检查每一行颜色并将其与预定义的颜色列表进行比较,然后根据此顺序构建新的Array / DataTable来实现。但是,我认为这是一种薄弱的方法。
答案 0 :(得分:5)
您可以将订单存储在另一个集合中,然后使用IndexOf
:
var colorOrderList = new List<string>{"red", "black", "blue", "white"};
table = table.AsEnumerable()
.OrderBy(row => colorOrderList.IndexOf(row.Field<string>("color")))
.CopyToDataTable();
答案 1 :(得分:1)
您可以定义
之类的n个排序数组var order = new [] { "red", "blue", "white"};
然后使用IndexOf
DataRow.Select().OrderBy(u=>Array.IndexOf(order, u[color]))
答案 2 :(得分:0)
使用IComparable进行自定义排序。 https://support.microsoft.com/en-ca/help/320727/how-to-use-the-icomparable-and-icomparer-interfaces-in-visual-c
答案 3 :(得分:0)
Products.OrderBy(u => u == "Red" ? 0 : u == "Black" ? 1 : u == "Blue" ? 2 : 3)
具有应转换为SQL语句的优势,以便数据库服务器可以进行排序。
答案 4 :(得分:0)
您可以使用IComaparable。首先创建一个可以容纳您的产品详细信息的自定义类。使此类实现IComparable接口。
public class ProductDetails : IComparable
{
public int ProductId { get; set; }
public int CompareTo(object obj)
{
ProductDetails prodDetails = obj as ProductDetails;
if (obj == null) return 1;
if (prodDetails != null)
{
if (this.ProductId < prodDetails.ProductId) return 1;
else
return 0;
}
else {
return 0;
}
}
}