将函数从vb转换为c#时遇到问题

时间:2015-01-10 02:41:29

标签: c# vb.net

我正在尝试将自己迁移到仅使用C#(是/我是vb.net的人) 我无法从迁移到C#

的项目转换此vb.net函数
Public Shared Function GetHolidays(ByVal holidaysFile As String) As List(Of Date)
    Dim sAllDates() As String = File.ReadAllLines(holidaysFile)
    Return (From sDate In sAllDates Select CDate(sDate)).ToList()
End Function

holidaysFile是一个包含这样的项目的文本文件;

2015年1月1日 2015年1月19日 2015年2月16日 2015年4月3日 2015年5月25日 2015年7月3日 2015年9月7日 2015年11月26日 2015年12月25日

任何帮助表示赞赏,并且streamreader可能是更好的阅读方式吗?

2 个答案:

答案 0 :(得分:4)

你可以做到

public static List<DateTime> GetHolidays(string holidaysFile)
{
    string[] sAllDates = File.ReadAllLines(holidaysFile);
    return (from sDate in sAllDates select Convert.ToDateTime(sDate)).ToList();
}

答案 1 :(得分:2)

这符合原作:

public static List<DateTime> GetHolidays(string holidaysFile)
{
    return File.ReadAllLines(holidaysFile).Select(d => Convert.ToDateTime(d)).ToList();
}

但它会让我使用像这样的List,除非真正需要它。下面的代码将允许您进行延迟评估,仅支持一次在RAM中保留一行,并且通常仍然可以在不更改调用代码的情况下工作 - 许多与使用StreamReader相同的好处。请注意,它也更短,如果需要,仍然可以轻松转换为List。虽然我在这里,因为你来自一个字符串,你可能会使用DateTime.Parse()方法做得更好:

public static IEnumerable<DateTime> GetHolidays(string holidaysFile)
{
    return File.ReadLines(holidaysFile).Select(d => DateTime.Parse(d));
}

作为一般规则,您几乎总是更好地编写代码来返回IEnumerable<T>而不是List<T>。你几乎没有什么可失去的,因为你可以总是在你需要时将.ToList()附加到这样一个函数的末尾,并且从一个底层集合类型更容易重构通过减少RAM的使用或避免循环使用列表中的项目来进行另一项潜在的性能改进,后来证明这是你从未需要的。