使用 C# 的 Linq 库进行排序

本文关键字:排序 Linq 使用 | 更新日期: 2023-09-27 18:35:40

我正在使用.NET Framework 3.5创建一个C# 2010应用程序。

我有一个包含几列和几行的数据网格视图[显然]。我将这个数据网格视图的行保存在形式List<string[]>的结构中。我还有一个包含系数的List<double>。我想使用 System.LINQ 库按系数对结构进行排序。我尝试了以下方法:

var linq_Query_rowrates =
    from rw in rows
    orderby matchrate descending
    select rw;

这将为查询中的行添加下划线,并显示以下错误:

错误 1 找不到源类型"System.Collections.Generic.List<string[]>"的查询模式的实现。 'OrderByDescending '未找到。 您是否缺少对"System.Core.dll"的引用或"System.Linq"的 using 指令?

是否可以使用 LINQ 库对这种结构进行排序,如果是,如何排序?

注意:我知道还有很多其他方法可以实现此目的,我只是对使用 LINQ 库执行此操作感兴趣。

注意:匹配率不是行的成员,但使用行的成员也不起作用。

后来编辑:也许应该是这样的?

        var linq_Query_rowrates =
            from rw in rows
            join rate in matchrate
            on matchrate equals rows
            orderby matchrate descending
            select rw;

使用 C# 的 Linq 库进行排序

假设matchraterw的成员,你需要使用以下语法:

var linq_Query_rowrates =
    from rw in rows
    orderby rw.matchrate descending
    select rw;

更新

理想情况下,您的费率关系将具有导航属性,因此查询将如下所示:

var linq_Query_rowrates =
    from rw in rows
    orderby rw.rate.matchrate descending
    select rw;

另一种选择是执行联接。但是 LINQ 中的联接很丑陋,我尽量避免它们。

它很丑陋,但它是 Linq:

            List<string[]> rows = null;
            List<double> coefficients = null;
            rows
                .Select((row, index) => new { Row = row, Index = index })
                .Join(coefficients
                            .Select(
                                (coefficient, index) => new { Coefficient = coefficient, Index = index }), 
                                x => x.Index, 
                                x => x.Index, 
                                (rowIndex, coefIndex) => new { Row = rowIndex.Row, Coefficient = coefIndex.Coefficient })
                .OrderBy(x => x.Coefficient)
                .Select(x => x.Row);

不过我还没有测试过。应该可以将其转换为查询表单。

如果你的系数集合旨在与你的 string[] 集合链接,你为什么要构建 2 个单独的、不相关的列表?当然,构建一个非常简单的结构来保存所有信息以确保每行始终有适当的系数会更健壮。它还使排序非常简单。

public struct CoefficientRow
{
    public double Coefficient;
    public string[] Cells;
    public CoefficientRow(double c, string[] cells)
    {
        this.Coefficient = c;
        this.Cells = cells;
    }
}

分拣变得轻而易举...

List<CoefficientRow> rows = new List<CoefficientRow>();
//populate the list...
var orderedRows = rows.OrderBy(cr => cr.Coefficient);
//or
var orderedRows = rows.OrderByDescending(cr => cr.Coefficient);

将它们插入到数据网格视图中也仍然非常简单:

foreach(var row in rows)
    this.dgvDataView.Rows.Add(row.Cells);

如果你可以使用.Net4,user676571的答案简化为:

IEnumerable<string> query = rows
  .Zip(coefficients, (r, c) => new {row = r, coef = c})
  .OrderByDescending(x => x.coef)
  .Select(x => x.row);