#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-адресом на исходный код