LINQ:使用辅助方法将IEnumerable <double>转换为IEnumerable <string>

5
我有一个IEnumerable,我想将其转换为IEnumerable。请问我做错了什么?

实际问题出现在我尝试遍历返回的IEnumerable时。我收到了InvalidCastException异常。我在调试器中看到字符串={System.Linq.Enumerable.WhereSelectEnumerableIterator}。
  private IEnumerable<string> ConvertToString(IEnumerable<double> doubles)
  {
     IEnumerable<string> strings = null;

     if (doubles != null)
        strings = doubles.Select(d => ConvertToString(d));

     return strings;
  }


  private string ConvertToString(double d)
  {
     return string.Format("{0:0.00}", d);
  }

好的,我解决了我的问题。这个Linq延迟执行使得调试变得棘手。实际上,我上游有一个调用导致了问题。

ICollection<float> floats; //pretend it holds valid data
ConvertToString(floats.Cast<double>()) //<---This is naughty

4
现有的代码不应抛出任何ArgumentNullException异常。因为d是值类型,所以它不能为null;而且你已经检查了doubles是否为null,因此它也不能为null。你可以添加一个短小但完整的程序来演示这个问题吗? - dtb
3个回答

6

我已经尝试了你的代码,没有出现错误。

这意味着你在方法中传入了一个空的IEnumerable<double>

附注: 你可以将你的方法简化为以下形式:

private IEnumerable<string> ConvertToString(IEnumerable<double> doubles)
{
   return doubles.Select(ConvertToString);
}

Matt,你是正确的。上面的代码示例应该可以工作。实际的异常是在我的代码中上游引起的,在我循环遍历IEnumarable<double>之前不会抛出。 - Osiris

1
为什么不这样做呢:

doubles.Select(d => d.ToString("0.00"));

或者为了一些真正有趣的事情,可以适应您的业务逻辑:

private IEnumerable<string> ConvertToString(IEnumerable<double> doubles, Func<string, double> convertToString)
{
    return doubles.Select(d => convertToString(d))
}

ConvertToString(doubles, d => d.ToString("0.00"));

业务逻辑实际上更加复杂,我只是为了这个问题而简化了它。 - Osiris

0
您可以通过以下方式轻松进行转换:
ver strings = doubles.Select(d => string.Format("{0:0.00}", d));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接