LinqToExcel加载字典

在此处输入图像描述 我有以下解决方案但不太优雅。 如果可能的话,我想用ToDictionary来解决这个问题。 谢谢你的帮助,因为我很新。

var excel = new ExcelQueryFactory(@"E:\MAHipotCepaStationProgram.xlsx"); //get list of program names List testNames = new List(); testNames.AddRange(excel.Worksheet().ToList() .Where(s => s["Program #"].Value.ToString() == "Program Title") .Select(s => s[1].Value.ToString())); //get list of program numbers List testNumbers = new List(); testNumbers.AddRange(excel.Worksheet().ToList() .Where(s => s["Program #"].Value.ToString() == "Program #") .Select(s => Convert.ToInt32(s[1].Value))); //combine them Dictionary programs = new Dictionary(); for (int x = 0; x < testNames.Count-1; x++) { if (!programs.ContainsKey(Convert.ToInt32(testNumbers[x]))) { programs.Add(Convert.ToInt32(testNumbers[x]), testNames[x]); } else { testNumbers[x].Dump("Duplicate Found"); } } programs.Dump("Dict"); 

这跟我的情况差不多,但不对。 错误:“需要一个IEnumberable类型的接收器,它不与我一起计算:

 var excel = new ExcelQueryFactory(@"E:\MAHipotCepaStationProgram.xlsx"); Dictionary programsDict = excel.Worksheet().ToDictionary( e => e["Program #"].Value.ToString() == "Program Title") .Select(s => s[1].Value.ToString()), f => f.Where(d => d.Value.ToString() == "Program #").ToString()); 

您可以使用sigle LINQ查询过滤值。这将返回excel中的名称和数字列:

  var sampleExcel = new ExcelQueryFactory(@"I:\Book1.xlsx"); var sampleWorksheet = from workSheet in sampleExcel.Worksheet("Sheet1") select workSheet; var selectedValues = from excelRow in sampleExcel.Worksheet() select new { name = excelRow[0], number =Convert.ToInt32(excelRow[1]) }; foreach (var item in selectedValues) { Console.WriteLine(string.Format("Name is {0} ,number is {1}",item.name,item.number)); } Dictionary dict = new Dictionary(); foreach (var item in selectedValues) { dict.Add(item.number, item.name); Console.WriteLine(string.Format("Name is {0} ,number is {1}", item.name, item.number)); } 

上述LINQ查询的等效lambda表达式:

 var selectedValues1 = sampleExcel.Worksheet().Select(x => new { name = x[0], number = x[1] }); 

快来看看:

 Dictionary programsDict = excel .Worksheet() .Select(x => new { A = x[0].ToString(), B = x[1].ToString() }) .ToArray() .Where(x => new [] { "Program #", "Program Title" }.Contains(xA)) .Buffer(2) .Select(x => new { title = x[0].B, number = int.Parse(x[1].B) }) .ToDictionary(x => x.number, x => x.title); 

您只需要NuGet“System.Interactive”来获取.Buffer(int)运算符。

或者使用此实现:

 public static IEnumerable Buffer(this IEnumerable source, int count) => source .Select((t, i) => new { t, i }) .GroupBy(x => xi / count) .Select(x => x.Select(y => yt).ToArray());