我正在尝试将自己迁移到仅使用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可能是更好的阅读方式吗?
答案 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的使用或避免循环使用列表中的项目来进行另一项潜在的性能改进,后来证明这是你从未需要的。