Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按子列表中的第一个值对列表进行排序_C#_List_Linq_Sorting - Fatal编程技术网

C# 按子列表中的第一个值对列表进行排序

C# 按子列表中的第一个值对列表进行排序,c#,list,linq,sorting,C#,List,Linq,Sorting,我有一个Row对象,它包含存储在RowValue对象中的值(列)列表。我想根据标记为第一列的列的值对该列表进行排序 RowValue对象具有名为“key”的属性,该属性是包含验证规则的列对象。它还有一个名为“value”的属性,它是该列的字符串或数值 列验证规则还包含一个名为“display_order”的属性,它告诉我在网格中显示列的顺序 我想根据第一列的值按升序对列表进行排序。基本上,我想对具有最小“display\u order”值的列的值进行排序 行对象: public class Ro

我有一个Row对象,它包含存储在RowValue对象中的值(列)列表。我想根据标记为第一列的列的值对该列表进行排序

RowValue对象具有名为“key”的属性,该属性是包含验证规则的列对象。它还有一个名为“value”的属性,它是该列的字符串或数值

列验证规则还包含一个名为“display_order”的属性,它告诉我在网格中显示列的顺序

我想根据第一列的值按升序对列表进行排序。基本上,我想对具有最小“display\u order”值的列的值进行排序

行对象:

public class Row
{
    public List<RowValue> Values { get; set; } = new List<RowValue>();
}
专栏:

public class Column
{
    public string name;
    public ColumnValidation ColumnValidation;
}
最后,验证:

public class ColumnValidation
{
    public string column_label;
    public DataTypeEnum data_type;
    public int width;
    public int decimal_places;
    public int display_order;
    public string calculation_formula;
    public string edit_style;
    public string default_value;
    public decimal? minimum_value;
    public decimal? maximum_value;
    public bool is_column_nullable = false;
    public bool inherit_values = false;
    public bool display_column = false;
    public bool is_editable = false;
    public int column_style;
    public string code_table_name;
    public string code_display_name;
    public string code_data_column_name;
}
我正试图用类似这样的方法重新排列我的行,但它似乎不起作用:

// reorder rows
// get the column definition for the first column
Column firstColumn = rows.Select(x => x.Values).FirstOrDefault().OrderBy(x => x.key.ColumnValidation.display_order).Select(x => x.key).FirstOrDefault();

rows = rows.OrderBy(x => x.Values.OrderBy(y => y.key.ColumnValidation.display_order).FirstOrDefault().value).ToList();

据我所知,您有一个行列表,每个行都包含一个包含值的列列表。这些列具有基于其显示顺序的固有排序键

然后,对于给定的结果集,您希望找到排序顺序最低的列,然后使用该列对所有行对象进行排序

我整理了一些代码。我把它放进去了。尝试更改排序顺序键,看看它是否符合您的请求

以下是代码的关键部分:

//查找实际存在的排序值最低的列
//获取跨行的所有值的平面列表
var firstColumnLabel=rows.SelectMany(l=>l.Values)
//获取验证列
.Select(v=>v.key.ColumnValidation)
//获取第一列的标签
.OrderBy(v=>v.display\u顺序)
.选择(v=>v.column\u标签)
.FirstOrDefault();
//按此列对行进行排序
//如果一行缺少该列,那么它将被撞到末尾
var SORTDROWS=行
.Select(r=>new{r,key=GetSortKey(r,firstColumnLabel)})
//将缺少列的行推到末尾
.OrderBy(rr=>rr.key==null?1:0)
//现在按实际键进行第二次排序
.ThenBy(rr=>rr.key)
//不使用排序键恢复原始行对象
.选择(rr=>rr.r);
// ...
静态字符串GetSortKey(行r,字符串列\u标签){
var列=r.值;
var colForLabel=columns.FirstOrDefault(c=>c.key.ColumnValidation.column\u label==column\u label);
if(colForLabel!=null){
返回colForLabel.value;
}
返回null;
}
以下是完整的代码:

使用系统;
使用System.Collections.Generic;
使用System.Linq;
公共课程
{
公共静态void Main()
{
//具有行值和列验证顺序的一些示例数据
var sampleRow1=new(字符串值、int列顺序、字符串列标签)[]{
(“Val 1”,2,“B栏”),
(“Val 2”,1,“A列”),
(“Val 30”,5,“E栏”)
};
var sampleRow2=new(字符串值、int列顺序、字符串列标签)[]{
(“Val 1”,2,“B栏”),
(“第2栏,第5栏,E栏”)
};
var sampleRows=new[]{sampleRow1,sampleRow2};
//建立行数据
var rows=新列表();
foreach(采样器OWS中的var采样器OW){
var row=新行();
行。添加(行);
row.Values=新列表();
foreach(sampleRow中的var sampleColumn){
row.Values.Add(新的RowValue{
value=sampleColumn.value,
键=新列{
ColumnValidation=新ColumnValidation
{
显示顺序=sampleColumn.column\u顺序,
column\u label=sampleColumn.column\u label
}
}
});
}//结束:在行中生成列
}//结束:生成行对象列表
//查找实际存在的排序值最低的列
//获取跨行的所有值的平面列表
var firstColumnLabel=rows.SelectMany(l=>l.Values)
//获取验证列
.Select(v=>v.key.ColumnValidation)
//获取第一列的标签
.OrderBy(v=>v.display\u顺序)
.选择(v=>v.column\u标签)
.FirstOrDefault();
//按此列对行进行排序
//如果一行缺少该列,那么它将被撞到末尾
var SORTDROWS=行
.Select(r=>new{r,key=GetSortKey(r,firstColumnLabel)})
//将缺少列的行推到末尾
.OrderBy(rr=>rr.key==null?1:0)
//现在按实际键进行第二次排序
.ThenBy(rr=>rr.key)
//不使用排序键恢复原始行对象
.选择(rr=>rr.r);
WriteLine($“我们按{firstColumnLabel}排序”);
foreach(分拣机中的var srow){
控制台。写入线(“行”);
foreach(当前值中的变量列){
WriteLine($“{col.key.ColumnValidation.column_label}={col.value}”);
}
}
}
静态字符串GetSortKey(行r,字符串列\u标签){
瓦尔科鲁
// reorder rows
// get the column definition for the first column
Column firstColumn = rows.Select(x => x.Values).FirstOrDefault().OrderBy(x => x.key.ColumnValidation.display_order).Select(x => x.key).FirstOrDefault();

rows = rows.OrderBy(x => x.Values.OrderBy(y => y.key.ColumnValidation.display_order).FirstOrDefault().value).ToList();
var ans = rs.OrderBy(r => r.Values.OrderBy(rv => rv.key.ColumnValidation.display_order)
                                  .First()
                                  .value)
            .ToList();
IEnumerable<Row> rows = ...
var result = rows.Select(row => new
{
    OriginalRow = row,

    // every row has zero or more Values
    // every RowValue has a Key.ColumnValidation.DisplayOrder
    // Order the RowValues by Key.ColumnValidation.DisplayOrder
    SortValue = row.Values
        .Orderby(rowValue => rowValue.Key.ColumnValidation.DisplayOrder)

        // from this sorted sequence of RowValues, select the Value
        .Select(rowValue => rowValue.Value)

        // and keep only the first one, which is the one of the first displayed column
        .FirstOrDefault(),
})
.OrderBy(selectResult => selectResult.SortedValue)
.Select(orderedSelectResult => orderedSelectResult.OriginalValue);