使用C#和#x27进行排序;林克图书馆
我正在使用.NETFramework 3.5创建一个C#2010应用程序 我有一个datagridview,其中包含一些列和行(显然)。我以使用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
列表
的形式保存此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);