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

trouble converting function from vb to c#

我正在尝试将自己迁移到仅使用 C#(was/am 一个 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-02-16 2015 年 4 月 3 日 2015/05/25 07/03/2015 2015 年 9 月 7 日 11/26/2015 12/25/2015

感谢任何帮助,streamreader 可能是更好的阅读方式?

你可以做到

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

这与原文相符:

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

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

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

作为一般规则,您几乎总是最好将代码编写为 return 和 IEnumerable<T> 而不是 List<T>。您不会有什么损失,因为您可以 always 只需在需要时将 .ToList() 附加到此类函数的末尾,并且在更容易重构方面可以获得很多好处通过减少 RAM 使用或避免循环遍历 List 中的项目,将基础集合类型转换为另一种并潜在地提高性能,后来证明您根本不需要。