【发布时间】:2021-09-26 03:29:04
【问题描述】:
我有代码:
using System;
using System.Globalization;
using System.IO;
using System.Linq;
namespace TimeTress
{
class Program
{
static void Main(string[] args)
{
var timelineCSV = GetListOfStringsFromTextFile("../../../../timeline.csv");
var peopleCSV = GetListOfStringsFromTextFile("../../../../people.csv");
var timeline = ReadData(timelineCSV);
var people = ReadData(peopleCSV);
}
static string GetNameOfPeoples(string[][] people)
{
var nowDate = DateTime.Now;
var countYears = 20;
if ((DateTime.IsLeapYear(yearBirthday)) && (bitrthdayElement.Year - nowDate.Year) <= countYears) return namePeople;
}
static (string, int, DateTime) GetNamePeoplesAndYears(string[][] people)
{
foreach (var elements in people)
{
DateTime bitrthdayElement = ParseDate(elements[2]);
var yearBirthday = bitrthdayElement.Year;
var namePeople = elements[1];
}
return (namePeople, yearBirthday, birthdayElement);
}
static string[] GetListOfStringsFromTextFile(string filePath)
{
string[] stringArray;
if (File.Exists(filePath))
{
stringArray = File.ReadAllLines(filePath);
}
else
{
stringArray = new string[0];
}
return stringArray;
}
static void OutputString(string[] getString)
{
foreach (var lines in getString)
{
Console.WriteLine(lines);
}
}
static string[][] ReadData(string[] array)
{
string[][] splitData = new string[array.Length][];
for (var i = 0; i < array.Length; i++)
{
var line = array[i];
string[] parts = line.Split(";");
splitData[i] = parts;
}
return splitData;
}
static DateTime ParseDate(string value)
{
DateTime date;
if (!DateTime.TryParseExact(value, "yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
{
if (!DateTime.TryParseExact(value, "yyyy-mm", CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
{
if (!DateTime.TryParseExact(value, "yyyy-mm-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
{
throw new Exception("WRONG FORMAT");
}
}
}
return date;
}
}
}
在 GetListOfStringsFromTextFile 我得到字符串 []。 在 ReadData 我得到一个字符串[][]。
整个程序运行正常,问题出在两种方法上。
GetNamePeoplesAndYears 从像 {1; 这样的文件中获取值姓名; date} 并返回三个值名称、出生年份和完整出生日期
第二种方法GetNameOfPeoples检查闰年的出生年份,然后检查这个人是否在20岁以下
【问题讨论】:
-
一个标准的
IsLeapYear算法:取年(int y)。测试y%400是否为零,如果是,返回是闰年,如果不是,测试y%100是否为零,如果是,返回不是闰年。然后测试y%4是否为零,如果是则return是闰年,否则return不是闰年 -
我有一个函数 IsLeapYear 在方法 GetNameOfPeoples 中检查闰年
-
bool IsLeapYear(int year) => year % 400 == 0 || (year % 4 == 0 ^ year % 100 == 0); -
我们可以使用 Flydog57 提到的这个条件找到闰年。 if ((((Year % 4 == 0) && (Year % 100 != 0)) || (Year % 400 == 0)){ //闰年 }
-
或
bool IsLeapYear(int year) => new DateTime(year, 2, 28).AddDays(1.5).Month == 2;。虽然,这很脆弱,每年都有一些数字。