【问题标题】:confused why IEnumerable to working invalid argument困惑为什么 IEnumerable 可以工作无效参数
【发布时间】:2013-03-11 16:04:25
【问题描述】:

您好,我遇到了一些麻烦,我在 SSIS 中有一个非常简单的脚本任务。这是我第一次使用 LINQ

string iFileName = (string)(Dts.Variables["iFileName"].Value);
string oFileName = (string)(Dts.Variables["oFileName"].Value);

try
{
   // string[] lines = File.ReadAllLines(@"\\Fcwdsqlanl01\e$\SQL_OLAP\Log\Billing_2.log");

    IEnumerable<string> stringsOut = File.ReadAllLines(iFileName)
          .Where(line => (char.IsDigit(line, 0)) && line.Contains(","))
          .Select(line => line);

    File.WriteAllLines(oFileName, stringsOut);
}
catch (Exception e)
{
    MessageBox.Show(e.Message);
}

这是我遇到的错误

'System.IO.File.WriteAllLines(string, string[])' 有一些无效的参数。

我不明白为什么它的参数有问题,因为我使用它的方式与 ReadAllLines 相同。我已经检查过了,stringsOut 变量保存了我想要的字符串数组。我意识到有一些方法可以不使用 WriteAllLines 来做到这一点,但我想这样做,假设我缺少一些简单的东西。

【问题讨论】:

  • 您可能需要使用采用String[] 的重载(只需在最后调用ToArray()),因为IEnumerable&lt;string&gt; overload 是.NET 4 中的新值。您使用的是什么框架版本?
  • 我永远无法理解为什么人们使用 SSIS 并在脚本任务中完成所有工作
  • 你的Select 方法没有做任何事情;它应该被删除。
  • @msmucker,如果没有脚本组件,您将如何执行此特定任务?你会使用内置的“在发送到连接管理器之前运行文件并格式化”组件吗?
  • 感谢我会做的服务

标签: c# .net linq io ssis


【解决方案1】:

WriteAllLines 期望 string[] 作为它的第二个参数,而您传递一个 IEnumerable&lt;string&gt;IEnumerable&lt;string&gt; 可以指代string[],但也可以指代任何其他也实现IEnumerable&lt;string&gt; 的类型。

这应该可行:

File.WriteAllLines(oFileName, stringsOut.ToArray());

【讨论】:

  • “在这种特殊情况下,IEnumerable 恰好引用了一个字符串[],”我不能同意这种说法。 stringsOut 变量根本没有引用 string[]
  • @juharr:太正确了!有人可能会说,我在写这句话时正在重新考虑这句话,我的大脑中有一个并发问题。会及时纠正。
【解决方案2】:

您正在为哪个版本的 .Net 编译?接受IEnumerable&lt;string&gt; 作为第二个参数的WriteAllLines 重载直到.Net 4.0 才添加。该方法存在于 3.0 中,但只有将 string[] 作为第二个参数的重载。

【讨论】:

    【解决方案3】:

    虽然您正在执行 ReadAllLines,但您正在应用 LINQ 过滤器,它将其转换为 IEnumerable&lt;string&gt;

    尝试将您的代码更改为类似

    IEnumerable<string> stringsOut = File.ReadAllLines(iFileName)
                      .Where(line => (char.IsDigit(line, 0)) && line.Contains(","))
                      .Select(line => line)
                      .ToArray();
    

    【讨论】:

      【解决方案4】:

      'System.IO.File.WriteAllLines(string, string[])'的最佳重载匹配

      我假设您低于 .NET 4,WriteAllLinesIEnumerable&lt;string&gt; 是 .NET 4 中的新功能。

      所以只使用数组版本:

      string[] stringsOut = File.ReadAllLines(iFileName)
          .Where(line => (char.IsDigit(line, 0)) && line.Contains(","))
          .Select(line => line)
          .ToArray();
      File.WriteAllLines(oFileName, stringsOut);
      

      【讨论】:

        【解决方案5】:

        File.WriteAllLines 方法确实将字符串数组作为第二个参数,而不是字符串

        【讨论】:

        • File.WriteAllLinesstring[] 作为第二个参数。这里的“不是”是无意的吗?
        • 是的,我并不是要在那里输入“不”。谢谢老哥
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-16
        • 1970-01-01
        • 2017-06-10
        • 2011-04-13
        • 1970-01-01
        • 2014-12-08
        相关资源
        最近更新 更多