Как я могу сделать этот цикл для печати значений по осям (x, y) из IEnumerable? - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть IEnumerable, как показано ниже:

IEnumerable<Object> a;
a = { City = "Houston", Temperature = "80", Season = "Fall"}
    { City = "Chicago", Temperature = "64", Season = "Fall"}
    { City = "San Francisco", Temperature = "70", Season = "Fall"}
    { City = "Houston", Temperature = "101", Season = "Summer"}
    { City = "Chicago", Temperature = "84", Season = "Summer"}
    { City = "San Francisco", Temperature = "90", Season = "Summer"}`

Я хочу напечатать это в листе Excel в «табличном формате». Ось X - это три города, а ось Y - времена года.

Как я могу образовать петлю?

Сейчас я печатаю оси x и y как:

var xaxis = a.select(x=>x.City).ToList();

var yaxis = a.select(x=>x.Season).ToList();
List<string> xList = new List<string>();
List<string> yList = new List<string>();
foreach(var y in yaxis)
{
  if(!yList.Contains(y))
  {
    worksheet.cells[rowindex,columnindex].Value = y.ToString();
    yList.Add(y);
  }
}
  columnindex= xcolumn;
  rowindex = yrow;

foreach(var x in xaxis)
{
  if(!xlist.Contains(x))
  {
    rowindex++;
    worksheet.cells[rowindex,columnindex].Value = x.ToString();
    xList.Add(x);
  } 
}

Я заблудился, как распечатать / просмотреть данные, чтобы напечатать температуру для каждой пары (city, season)! Как я могу сделать этот цикл правильно?

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Во-первых, вы должны создать класс, как указал Maxim_A.

Затем вы можете использовать приведенный ниже код для динамического и удобочитаемого решения.

// change as needed
const int headerRowIndex = 1;
const int headerColumnIndex = 1;

// prepare keys
var cities = a.GroupBy(x => x.City).Select(x => x.Key).ToList();
var seasons = a.GroupBy(x => x.Season).Select(x => x.Key).ToList();

// set cities
var columnIndex = headerColumnIndex;
cities.ForEach(x => worksheet.Cells[headerRowIndex, ++columnIndex].Value = x);

// set seasons
var rowIndex = headerRowIndex;
seasons.ForEach(x => worksheet.Cells[++rowIndex, headerColumnIndex].Value = x);

// set temperatures
a.ToList().ForEach(x => worksheet.Cells[seasons.IndexOf(x.Season) + headerRowIndex + 1, cities.IndexOf(x.City) + headerColumnIndex + 1].Value = x.Temperature);
1 голос
/ 30 сентября 2019

Я создал класс с вашей структурой.

public class Item
{
    public string City { get; set; }
    public string Season { get; set; }
    public string Temperature { get; set; }
}

Затем я взял ваш массив, сгруппировал его по городам и отобразил в виде таблицы. Вы не предоставили информацию, с которой вы пишете в файл Excel (возможно, Excel.Interop), но я работаю с документами .XLSX, используя библиотеку epplus. Позвольте мне уточнить, что нумерация строк и столбцов в этой библиотеке начинается с единицы.

Код:

        List<Item> list = new List<Item>()
        { 
            new Item() { City = "Houston", Temperature = "80", Season = "Fall"},
            new Item() { City = "Chicago", Temperature = "64", Season = "Fall"},
            new Item() { City = "San Francisco", Temperature = "70", Season = "Fall"},
            new Item() { City = "Houston", Temperature = "101", Season = "Summer"},
            new Item() { City = "Chicago", Temperature = "84", Season = "Summer"},
            new Item() { City = "San Francisco", Temperature = "90", Season = "Summer"}
        };

        var listGroups = from item in list 
                         group item by item.City;

        int count = 2;

        var fileInfo = new FileInfo(@"myworkbook.xlsx");
        using (var excelPackage = new ExcelPackage(fileInfo))
        {
            var workbook = excelPackage.Workbook.Worksheets.Add($"Worksheets_{DateTime.Now.ToString("yyyy-MM-dd HH.mm.ss")}");


            workbook.Cells[2, 1].Value = "Summer";
            workbook.Cells[3, 1].Value = "Fall";

            foreach (var item in listGroups)
            {
                workbook.Cells[1, count].Value = item.Key;
                foreach (var temp in item)
                {
                    if (temp.Season == "Summer")
                        workbook.Cells[2, count].Value = temp.Temperature;
                    else
                        workbook.Cells[3, count].Value = temp.Temperature;
                }
                count++;
            }
            excelPackage.Save();
        }

Результат:

Result

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...