我正在尝试学习linq并需要帮助将以下for循环转换为linq查询。在for循环结束时,我应该能够解析exampleDataList并获取值。我该怎么做?
string filename = Server.MapPath("/") + "MyExcelFileData.xlsx";
const int startRow = 1;
IList<double> exampleDataList = new List<double>();
var existingFile = new FileInfo(filename);
using (var package = new ExcelPackage(existingFile))
{
ExcelWorkbook workBook = package.Workbook;
var currentWorksheet = workBook.Worksheets.First();
for (int rowNumber = startRow + 1; rowNumber <= currentWorksheet.Dimension.End.Row; rowNumber++)
{
var col1Value = Convert.ToDouble(currentWorksheet.Cells[rowNumber, 1].Value);
exampleDataList.Add(col1Value);
}
}
答案 0 :(得分:5)
首先改变这个:
IList<double> exampleDataList = new List<double>();
为:
List<double> exampleDataList = new List<double>();
对于局部变量,不需要使用接口而不是具体类型。然后你就可以写下:
exampleDataList.AddRange(
Enumerable.Range(startRow + 1, currentWorksheet.Dimension.End.Row)
.Select(i => Convert.ToDouble(currentWorksheet.Cells[i, 1].Value)));
首先使用startRow + 1
辅助函数创建一个包含currentWorksheet.Dimension.End.Row
到Enumerable.Range()
的数字的枚举。然后使用Select()
将该序列投影到其他内容。 Lambda只是模仿你在for
循环中所做的事情。
如果您正在学习LINQ内容,我强烈建议您查看EduLINQ篇文章(来自我们的 Jon Skeet)。他们做得很好,您将了解有关如何实施的许多细节。
编辑正如comment中的rae1n所指出的,如果exampleDataList
仅包含来自此LINQ查询的数据(您不需要在查询之前添加内容)然后,您可以使用ToList()
将Select()
返回的枚举直接转换为List<double>
。