0

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

我有一个包含几列和几行的datagridview [显然]。我将此 datagridview 的行保存在 form 的结构中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或“”的 using 指令System.Linq

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

注意:我知道有很多其他方法可以做到这一点,我只是对使用 LINQ 库感兴趣。

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

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

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

4 回答 4

3

假设matchrate是 的成员rw,则需要使用以下语法:

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 中的连接很难看,我尽量避免使用它们。

于 2012-05-30T13:07:57.907 回答
2

这很丑,但它是 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);

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

于 2012-05-30T13:36:19.437 回答
2

如果您的系数集合旨在与您的字符串 [] 集合链接,那么为什么要构建 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);

将它们插入到 datagridview 中也很容易:

foreach(var row in rows)
    this.dgvDataView.Rows.Add(row.Cells);
于 2012-05-30T14:02:52.473 回答
1

如果您可以使用 .Net4,则 user676571 的回答简化为:

IEnumerable<string> query = rows
  .Zip(coefficients, (r, c) => new {row = r, coef = c})
  .OrderByDescending(x => x.coef)
  .Select(x => x.row);
于 2012-05-31T20:51:21.810 回答