Вопрос:

LinqToExcel для загрузки словаря

c# performance linq dictionary linq-to-excel

68 просмотра

2 ответа

84 Репутация автора

введите описание изображения здесьЯ разработал следующее, но довольно элегантно. Я хотел бы поработать с ToDictionary, если это возможно. Спасибо за любую помощь, так как я довольно новый.

var excel = new ExcelQueryFactory(@"E:\MAHipotCepaStationProgram.xlsx");

//get list of program names
List<string> testNames = new List<string>();
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<int> testNumbers = new List<int>();
testNumbers.AddRange(excel.Worksheet().ToList()
            .Where(s => s["Program #"].Value.ToString() == "Program #")
            .Select(s => Convert.ToInt32(s[1].Value)));

//combine them
Dictionary<int, string> programs = new Dictionary<int, string>();
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 string, который не работает со мной:

var excel = new ExcelQueryFactory(@"E:\MAHipotCepaStationProgram.xlsx");

Dictionary<string, string> programsDict = excel.Worksheet().ToDictionary<string, string>(
                                        e => e["Program #"].Value.ToString() == "Program Title")
                                            .Select(s => s[1].Value.ToString()),
                                        f => f.Where(d => d.Value.ToString() == "Program #").ToString());
Автор: Kelly Kleinknecht Источник Размещён: 16.06.2018 04:40

Ответы (2)


0 плюса

341 Репутация автора

Вы можете отфильтровать значения, используя запрос LINQ sigle. Это вернет столбцы name и number в 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<int, string> dict = new Dictionary<int, string>();

        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:

var selectedValues1 = sampleExcel.Worksheet().Select(x => new { name = x[0], number = x[1] }); 
Автор: ashish Размещён: 16.06.2018 06:27

0 плюса

81079 Репутация автора

Попробуй это:

Dictionary<int, string> programsDict =
    excel
        .Worksheet()
        .Select(x => new { A = x[0].ToString(), B = x[1].ToString() })
        .ToArray()
        .Where(x => new [] { "Program #", "Program Title" }.Contains(x.A))
        .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<T[]> Buffer<T>(this IEnumerable<T> source, int count)
    =>
        source
            .Select((t, i) => new { t, i })
            .GroupBy(x => x.i / count)
            .Select(x => x.Select(y => y.t).ToArray());
Автор: Enigmativity Размещён: 17.06.2018 02:26
Вопросы из категории :
32x32