Как нарисовать два списка элементов рядом

#c# #.net

#c# #.net

Вопрос:

Я пытаюсь нарисовать некоторый список элементов и распечатать их в файл в этом формате

  items   amount

 maize   $50
 meat    $100
  

я пытался использовать stringbulder

 private List<sting> _Items;
private List<string> _Uprices;

//list of items
StringBuilder myItems = StringBuilder();
foreach (var item in _Items) {
    myItems.AppendLine(item.PadRight (30));
}

//list of prices
StringBulder prices = StringBuilder();
foreach (var item in _Uprices) {
    prices.AppendLine(item.PadRight (30));
}
  

затем

 Graphics g = e.Graphics();
g.DrawString(myItems,new Font("Times New Roman",12),new SolidBrush(Color.Black),20,20);
  

но результат, который я получаю здесь, ужасен,
если я добавляю элементы foreach в строку, печатается последнее значение.
пожалуйста, кто-нибудь может мне помочь в этом?

что я делаю не так, пожалуйста, у меня есть поиск в Google, не удалось найти ответ.

Обновить:

пожалуйста, проверьте этот фрагмент кода здесь

я думаю, что вопрос не совсем понятен. но я обновил его ссылкой на исходный код, распечатав в OneNote.

Комментарии:

1. Печать их в файл и печать их на графике — это две разные вещи.

2. Вы хотите файл или экран?

3. Вы можете создать массив строк, а затем распечатать их в цикле foreach с g.DrawString помощью метода один за другим.

4. Это не отвечает на вопрос как таковой; но если существует корреляция между элементом и ценой, лучшим способом было бы сохранить два свойства вместе в какой-то структуре или классе; и тогда вы можете переопределить . toString()

5. Для печати или отображения столбцов вам часто потребуется использовать шрифт фиксированного размера , например Courier или Consolas. Помимо этого вам нужно уточнить свою фактическую цель. Ответы сильно отличаются смехотворным образом, потому что, похоже, никто не понимает ваш вопрос!

Ответ №1:

Неясно, потому что вы говорите, что хотите записать в файл, но используете Graphics .

Предполагая, что вывод будет в файл: используя Zip интерполяцию строк Linq и C # 6.0, вы можете сделать это следующим образом:

 List<string> _Items = new List<string> { "maize", "meat" };
List<string> _Uprices = new List<string> { "$50", "$100" };

// For prior c# 6 use here string.Format
var lines = _Items.Zip(_Uprices, (item, price) => $"{item}  {price}").ToList();

using (var stream = File.CreateText(@"C:myfile.txt"))
{
    stream.WriteLine("Items - Amount");
    lines.ForEach(stream.WriteLine);
}

//Output:

// maize  $50
// meat   $100
  

Для вывода OneNote повторите приведенное using выше с:

 foreach(var line in lines)
{
    g.DrawString(line,new Font("Times New Roman",12),new SolidBrush(Color.Black),20,20);
}
  

Я все же рекомендовал бы использовать какую-то другую структуру для данных, например, класс с 2 свойствами, а не 2 списка, которые коррелируют по индексу

Комментарии:

1. я попробую использовать класс со свойствами и вернусь к вам

2. @EzeSundayEze — Я видел ваше обновление, и вы хотите распечатать его в OneNote. В основном замените код using на то, что вам нужно, но основной проблемой является форматирование строк, а именно .Zip 🙂

3. @EzeSundayEze — я не уверен, что понимаю. Каждый элемент lines — это строка, которую вы хотите. Поместите это в g.DrawString(line,new Font("Times New Roman",12),new SolidBrush(Color.Black),20,20);

4. Спасибо, я приму это как свой ответ. Я исправлю остальное. Спасибо.

Ответ №2:

Для печати в файл вам необходимо использовать File и Text Writer.

 if (!File.Exists(path))
    File.Create(path);

TextWriter tw = new StreamWriter(path);
tw.WriteLine("items ammount");
tw.Close(); 
  

Для того, чтобы сгенерировать 2 вещи бок о бок, это способ.

 if (_Items.Count == _Uprices.Count)
{
    for (int i = 0; i < _Items.Count; i  )
    {
        tw.WriteLine(String.Format("{0} {1}",_Items[i],_Uprices[i]));
    }
}
  

Я не собираюсь приводить полный сценарий. Смешивайте и сопоставляйте, чтобы лучше понять это.

Комментарии:

1. я не пытаюсь записать в файл.

Ответ №3:

Трудно сказать без дополнительной информации, но я думаю, вы хотите создать свою строку с помощью одного цикла for .

 private List<sting> _Items;
private List<string> _Uprices;

StringBuilder myItems = StringBuilder();
foreach (var i = 0; i < _Items.Count; i  ) {
    myItems.AppendLine(_Items[i].PadRight(30)   _Uprices[i]);
}

Console.Write(myItems);
  

Комментарии:

1. я использовал этот фрагмент кода, но вывод перекрывается с другим содержимым. @styfle

Ответ №4:

Вы пробовали использовать словарь?

 Dictionary<string, string> dictionary = new Dictionary<string, string>();
  

Ответ №5:

Почему бы не использовать словарь и просто распечатать ключ со значением?

а затем попробуйте это

 int y=20;
    foreach(var keyValuePair in dictionary) {
     g.DrawString(keyValuePair.Key "t" keyValuePair.Value, new Font("Times New Roman",12, new SolidBrush(Color.Black),20,y =15);
    }
  

Комментарии:

1. Может случиться так, что элементы _Items не уникальны ; если они есть Dictionary<String, String> , это ошибка.

Ответ №6:

Я предлагаю Linq, Zip если быть точным:

Чтобы нарисовать все строки вместе:

 string myItems = string.Join(Environment.NewLine, _Items
  .Zip(_Uprices, (item, price) => $"{item}  {price}"));

g.DrawString(myItems, ...);
  

Если вы хотите поместить строки в файл:

 File.WriteAllLines(@"C:MyFile.txt", _Items
  .Zip(_Uprices, (item, price) => $"{item}  {price}")); 
  

Наконец, вы можете материализовать результат (скажем, в виде массива) и либо нарисовать его, либо записать в файл:

 string[] result = _Items
  .Zip(_Uprices, (item, price) => $"{item}  {price}")
  .ToArray();

...

// draw all the lines in one go 
g.DrawString(string.Join(Environment.NewLine, result) ...); 

...
// draw line after line (in case you have other lines/text to output)
for (int i = 0; i < result.Length;   i) {
  g.DrawString(result[i], ...);
  ... 
}  

...

File.WriteAllLines(@"C:MyFile.txt", result);
  

Комментарии:

1. это работает, но перекрывается с другим содержимым, я обновил вопрос с URL-адресом на исходный код