如何将下面的查询修改为包含行号的列(即:基于一的结果索引)?
var myResult = from currRow in someTable
where currRow.someCategory == someCategoryValue
orderby currRow.createdDate descending
select currRow;
EDIT1:我希望结果是{idx, col1, col2...col-n}
,而不是{idx, row}
。
EDIT2:行号应该对应于结果行,而不是表行。
EDIT3:我将这些结果DataBind
到一个GridView
。我的目标是在GridView
中添加一个行号列。也许另一种方法会更好。
发布于 2013-02-19 23:07:13
为了好玩,这里有一个Select
的替代方案,有两个参数:
var resultsWithIndexes = myResult.Zip(Enumerable.Range(1, int.MaxValue - 1),
(o, i) => new { Index = i, Result = o });
发布于 2013-02-19 23:04:15
关于?
int i;
var myResult = from currRow in someTable
where currRow.someCategory == someCategoryValue
orderby currRow.createdDate descending
select new {Record = i++, currRow};
发布于 2016-07-08 08:07:53
如果想要保持一个列的平面列表(即OP的Edit2),并且还想要一个通用的解决方案来处理任何IEnumerable,而不需要列出期望的列的集合,那么就没有简单的方法。
但是,有一种间接的方法,即使用here中的ToDataTable()方法将查询结果转储到DataTable中,然后将RowNumber列添加到该表中。
var table = query.ToList().ToDataTable();
table.Columns.Add("RowNum", typeof(int));
int i = 0;
foreach (DataRow row in table.Rows)
row["RowNum"] = ++i;
这可能会导致大型数据集的性能问题,但它也不是非常慢。在我的机器上,一个大约有6500行的数据集需要33ms来处理。
如果原始查询返回匿名类型,则该类型定义将在转换中丢失,因此在调用table.AsEnumerable()时将丢失对结果IEnumerable的列名的静态类型。换句话说,您不能编写像table.AsEnumerable().First().RowNum这样的代码,而必须编写table.AsEnumerable().First()"RowNum“。
但是,如果您不关心性能,并且确实希望恢复静态类型,那么可以使用JSON.NET将DataTable转换为json字符串,然后再转换回基于原始查询结果中的匿名类型的列表。此方法要求在原始查询结果中存在占位符RowNum字段。
var query = (from currRow in someTable
where currRow.someCategory == someCategoryValue
orderby currRow.createdDate descending
select new { currRow.someCategory, currRow.createdDate, RowNum = -1 }).ToList();
var table = query.ToDataTable();
//Placeholder RowNum column has to already exist in query results
//So not adding a new column, but merely populating it
int i = 0;
foreach (DataRow row in table.Rows)
row["RowNum"] = ++i;
string json = JsonConvert.SerializeObject(table);
var staticallyTypedList = JsonConvert.DeserializeAnonymousType(json, query);
Console.WriteLine(staticallyTypedList.First().RowNum);
这为我的6500项数据集增加了大约120ms的处理时间。
这很疯狂,但它是有效的。
https://stackoverflow.com/questions/14960563
复制相似问题