【问题标题】:Append Loop Variable to Variable Name将循环变量附加到变量名称
【发布时间】:2015-08-23 23:35:49
【问题描述】:

我有 5 个需要转换为 TXT 文件的数据表。我认为我没有单独创建它们,而是使用for 循环。这是我的代码:

StringBuilder sb = new StringBuilder();
for (int i = 1; i < 5; i++)
{
    DataTable dtFile1 = file1BLO.SelectFile1ForCSV()
    foreach (DataRow dr in dtFile1.Rows)
    {
        string[] fields = dr.ItemArray.Select(field => field.ToString()).ToArray();
        sb.AppendLine(string.Join("|", fields) + "|");
    }
    Response.ContentType = "application/text";
    Response.AddHeader("content-disposition", "attachment;filename=CAPRES-FILE1-"
                + DateTime.Now.ToString("yyyyMMdd-HHmmss") + ".txt");
    Response.Output.Write(sb);
    Response.Flush();
    Response.End();
    sb.Clear();
}

我希望将迭代器附加到变量名和方法中。赞这个DataTable dtFile + i = file + i + BLO.SelectFile + i + ForCSV();

谢谢!

SelectFile1ForCSV() 的请求代码

public DataTable SelectFile1ForCSV()
{
    return file1DAO.SelectFile1ForCSV();
}

编辑:对不起,我似乎没有提供足够的细节,我的问题引起了混乱。现已编辑。

【问题讨论】:

  • 请出示SelectFile1ForCSV()的(正文)
  • 如果有五个文件,不应该是i = 1还是i &lt; 5
  • @Robert 不错!我会编辑它。
  • Response.End 在循环内?
  • file1DAO 声明在哪里?停止将 1 放入所有方法和变量名称中,只需将 i 作为参数传递到您构建文件名的位置。

标签: c# string for-loop iterator append


【解决方案1】:

使用这个:

Response.AddHeader("content-disposition", "attachment;filename=CAPRES-FILE"
            + i
            + "-"
            + DateTime.Now.ToString("yyyyMMdd-HHmmss") + ".txt");

这将创建一个包含i 值的文件名。

【讨论】:

  • 这只是问题的一部分。主要问题是在循环中使用正确的对象。其他两个答案解决了这个问题。
  • 是的,这个答案回答了问题的第二部分。
【解决方案2】:

您不能只是在运行时将数字附加到变量名来神奇地引用新变量。你应该做的是:

定义一个接口:

public interface IFileBLO
{
    DataTable SelectFileForCSV();
}

File1BLOFile2BLO 等都实现IFileBLO 并修复方法名称,使它们都是SelectFileForCSV 而不是SelectFile1ForCSV 等。

添加查找以供参考这些对象:

var bloList = new IFileBLO[]
{
    file1BLO, file2BLO, file3BLO, file4BLO, file5BLO
};

最后,将循环更改为:

for (int i = 0; i < 5; i++)
{
    var dtFile = bloList[i].SelectFileForCSV();
    foreach (var dr in dtFile.Rows)
    {
        ...

【讨论】:

    【解决方案3】:

    问题中没有足够的信息来确切地知道问题所在,所以我只是在这里猜测。您的问题是您有五个对象,它们都有一个方法,并且这些方法具有不同的名称。不过,这些方法返回相同的东西,DataTable,可以在循环中使用。

    如果是这种情况,那么只需从循环中取出不同的部分,以便在循环中保持相同的部分。像这样的:

    DataTable[] fiveTables =
    {
        file1BLO.SelectFile1ForCSV(),
        file2BLO.SelectFile2ForCSV(),
        file3BLO.SelectFile3ForCSV(),
        file4BLO.SelectFile4ForCSV(),
        file5BLO.SelectFile5ForCSV()
    }
    
    for (int i = 1; i <= 5; i++)
    {
        // Use fiveTables[i] for DataTable, and i for file name
    }
    

    【讨论】:

    • 这个 püart 读取数据库中的数据。它错过了编写 .txt 文件(作为原始问题)
    • 另外:i &lt;=5 而不是i&lt;5
    • 您说得对,先生。我会试试这个。为什么我没有想过创建一个 DataTable 数组?呵呵。谢谢!
    • @Jeano 这是快速而肮脏的修复方法,但有一种更优雅(和正确)的方法。请参阅 David Arno 的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多