使用C#和#x27进行排序;林克图书馆

使用C#和#x27进行排序;林克图书馆,c#,.net,linq,C#,.net,Linq,我正在使用.NETFramework 3.5创建一个C#2010应用程序 我有一个datagridview,其中包含一些列和行(显然)。我以列表的形式保存此datagridview的行。我还有一个包含系数的列表。我想使用System.LINQ库按系数对结构进行排序。我尝试了以下几点: 这将在查询中的行下面加下划线,并显示以下错误: 错误1找不到源类型“System.Collections.Generic.List”的查询模式的实现OrderByDescending。您是否缺少对“System.C

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

我有一个datagridview,其中包含一些列和行(显然)。我以
列表
的形式保存此datagridview的行。我还有一个包含系数的
列表。我想使用
System.LINQ
库按系数对结构进行排序。我尝试了以下几点:

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

错误1找不到源类型“
System.Collections.Generic.List
”的查询模式的实现<找不到代码>OrderByDescending
。您是否缺少对“
System.Core.dll
”的引用或“
System.Linq
”的using指令

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

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

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

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

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

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

很难看,但它是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);
列表行=null;
列表系数=空;
排
.Select((行,索引)=>new{row=row,index=index})
.Join(系数)
.选择(
(系数,指数)=>新的{系数=系数,指数=指数}),
x=>x.索引,
x=>x.索引,
(rowIndex,coefIndex)=>new{Row=rowIndex.Row,coefIndex.coeffier})
.OrderBy(x=>x.系数)
.选择(x=>x.Row);

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

如果您的系数集合要与字符串[]集合链接,为什么要构建两个独立的、不相关的列表?当然,只构建一个非常简单的结构来保存所有信息,以确保每一行都有合适的系数,这会更加健壮。它还使排序变得非常简单

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);

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

IEnumerable<string> query = rows
  .Zip(coefficients, (r, c) => new {row = r, coef = c})
  .OrderByDescending(x => x.coef)
  .Select(x => x.row);
IEnumerable查询=行
.Zip(系数,(r,c)=>new{row=r,coef=c})
.OrderByDescending(x=>x.coef)
.选择(x=>x.row);

您是否引用了“System.Core.dll”,并使用System.Linq包含了一个
指令?@dtb,是的,我已经包括了使用System.Linq;并引用了dll。行和系数是如何关联的?按索引?它不是成员,但使用行成员也不起作用。您不能按非rw类型成员的内容排序。好的,有没有办法仅使用LINQ按匹配率对行进行排序?也许类似的方法可以起作用?var linq_Query_rowrates=from rw in rows join rate in matchrate on matchrate等于rows orderby matchrate降序选择rw;是的,你可以用一个连接来完成。我需要它来按降序排序。我将如何执行此操作?将
OrderBy
替换为
OrderByDescending
foreach(var row in rows)
    this.dgvDataView.Rows.Add(row.Cells);
IEnumerable<string> query = rows
  .Zip(coefficients, (r, c) => new {row = r, coef = c})
  .OrderByDescending(x => x.coef)
  .Select(x => x.row);