输出到文件c#

输出到文件c#,c#,algorithm,filewriter,apriori,C#,Algorithm,Filewriter,Apriori,我使用Apriori算法来获得强规则。到目前为止,我已经在一个列表框中找到了它们(这个程序是在网上找到的)。但是现在我想将输出保存到txt文件中。到目前为止,我在.txt文件中得到的只是“AprioriAlgorithm.Rule”。它获得了正确的规则数,因此重复“AprioriAlgoritm.Rule”获取规则数。例如,如果我有12条强规则,我会在txt文件中获得12次AprioriAlgoritm.Rule namespace WPFClient { [Export(typeof(IRes

我使用Apriori算法来获得强规则。到目前为止,我已经在一个列表框中找到了它们(这个程序是在网上找到的)。但是现在我想将输出保存到txt文件中。到目前为止,我在.txt文件中得到的只是“AprioriAlgorithm.Rule”。它获得了正确的规则数,因此重复“AprioriAlgoritm.Rule”获取规则数。例如,如果我有12条强规则,我会在txt文件中获得12次AprioriAlgoritm.Rule

namespace WPFClient
{
[Export(typeof(IResult))]
public partial class Result : Window, IResult
{
    public Result()
    {
        InitializeComponent();
    }

    public void Show(Output output)
    {
        FileStream fs = new FileStream("strongrules.txt", FileMode.Create);
        StreamWriter sw = new StreamWriter(fs);
        this.DataContext = output;
        for (int x = 0; x < output.StrongRules.Count; x++)
        {
            sw.WriteLine(output.StrongRules[x]);
        }

        this.ShowDialog();
        sw.Close();

    }
  }
}
名称空间WPFClient
{
[导出(类型(IResult))]
公共部分类结果:窗口,IResult
{
公开结果()
{
初始化组件();
}
公共无效显示(输出)
{
FileStream fs=newfilestream(“strongrules.txt”,FileMode.Create);
StreamWriter sw=新StreamWriter(fs);
this.DataContext=输出;
对于(int x=0;x
这是输出类

namespace AprioriAlgorithm
{
using System.Collections.Generic;

public class Output
{
    #region Public Properties

    public IList<Rule> StrongRules { get; set; }

    public IList<string> MaximalItemSets { get; set; }

    public Dictionary<string, Dictionary<string, double>> ClosedItemSets { get; set; }

    public ItemsDictionary FrequentItems { get; set; } 

    #endregion
}
}
namespace算法
{
使用System.Collections.Generic;
公共类输出
{
#区域公共财产
公共IList strong规则{get;set;}
公共IList MaximaliteMets{get;set;}
公共字典ClosedItemSets{get;set;}
公共项Dictionary FrequentItems{get;set;}
#端区
}
}

由于您要将类型为
Rule
的对象而不是
string
传递给
WriteLine
方法,因此您必须指定确切的输出内容

为此,需要重写
规则
类的
ToString()
方法

public class Rule
{
    public string RuleName { get; set; }
    public string RuleDescription { get; set; }

    public override string ToString()
    {
        return string.Format("{0}: {1}", RuleName, RuleDescription);
    }
}
正如所说

通过调用对象上的ToString方法写入对象的文本表示形式,后跟文本字符串或流的行终止符

另一种方法(除了覆盖
ToString
)是输出各个属性:

var rule = output.StringRules[x];
sw.WriteLine("{0}: {1}", rule.RuleName, rule.RuleDescription);
或者,使用C#的特性:


如果您不能或不想覆盖
ToString

这不是问题,请使用此选项。请在以“?”结尾的一句话中总结您想要的内容(您可以在后面详细说明)您也不需要使用FileStream。相反,您可以使用字符串生成器构建文本,然后使用System.IO->
file.WriteAllText(outputPath,stringBuilder.ToString())中的file helper类将文本输出到文件中
@StephenPorter:为什么要创建一个
StringBuilder
,然后写入文件?这样效率不会更高,如果输出非常大,可能会耗尽内存。有很多方法可以避免直接处理
文件流
(例如,使用LINQ和
file.writeAllines
),但
StringBuilder
方法并不是一个特别好的选择。@JimMischel它总是逐案进行。使用流没有错,这只是一个选择。如果你有一个庞大的数据集,想要使用流,那就千方百计去做。我倾向于说“采用Martin Fowler方法”“这意味着,通常效率意味着不易维护的隐藏代码,而易于维护的代码通常意味着效率较低,因此,根据您试图解决的当前问题,找到两者之间的共同点。
sw.WriteLine($"{rule.RuleName}: {rule.RuleDescription}");