如何并排绘制两个项目列表

时间:2016-10-11 15:03:01

标签: 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项添加到字符串,则打印最后一个值。 请有人帮我解决这个问题吗?

我做错了,请搜索谷歌,找不到答案。

更新:

请检查此代码段 here

我认为这个问题并不是很清楚。但我已经用源代码链接更新了它,打印到OneNote。

6 个答案:

答案 0 :(得分:1)

要打印到文件,您需要使用文件和文本编写器。

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

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

为了并排产生两件事,这是一种方式。

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

我不会给出完整的脚本。混合搭配以更好地理解它。

答案 1 :(得分:0)

如果没有更多信息,很难分辨,但我认为你想用一个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);

答案 2 :(得分:0)

你尝试过使用词典吗?

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

答案 3 :(得分:0)

为什么不使用字典而只打印带有值的键?

然后尝试这个

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);
    }

答案 4 :(得分:0)

目前尚不清楚,因为您说要写入文件但使用Graphics

假设输出是文件: 使用Linq的Zip和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个按索引关联的列表

答案 5 :(得分:0)

我建议 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);