【问题标题】:Can't link two methods C#无法链接两个方法C#
【发布时间】: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) =&gt; year % 400 == 0 || (year % 4 == 0 ^ year % 100 == 0);
  • 我们可以使用 Flydog57 提到的这个条件找到闰年。 if ((((Year % 4 == 0) && (Year % 100 != 0)) || (Year % 400 == 0)){ //闰年 }
  • bool IsLeapYear(int year) =&gt; new DateTime(year, 2, 28).AddDays(1.5).Month == 2;。虽然,这很脆弱,每年都有一些数字。

标签: c# task


【解决方案1】:

如果您想链接两个方法 GetNamePeoplesAndYears 和 GetNameOfPeoples 并返回值,您可能需要更改传递给 GetNameOfPeoples 函数的参数。通过传递各自的值或具有所需数据的类可以解决您的问题。例如:

 var result =  GetNamePeoplesAndYears(people);
 GetNameOfPeoples(result.Item1, result.Item2, result.Item3);


      static string GetNameOfPeoples(string namePeople, int yearBirthday, DateTime bitrthdayElement )
        {
            var nowDate = DateTime.Now;
            var countYears = 20;
            if ((DateTime.IsLeapYear(yearBirthday)) && (bitrthdayElement.Year - nowDate.Year) <= countYears) 
                return namePeople;
             return String.Empty; // if your data doesn't met the condion it needs to return some string. So add needful 

            }

通过使用类,您也可以做到这一点。那么参数将是该类的对象。 希望它能帮助您解决这个问题。

编辑:如果您希望字符串[][] 作为输入参数并返回所有姓名和年龄,您可以试试这个

static List<propleData> NamePeoples(string[][] people) {
            
        var listPeople = new List<propleData> { };
        foreach (var elements in people) 
        {
            var item = new propleData();
           
            item.names = elements[1];
            item.years = ParseDate(elements[2]).Year;
            listPeople.Add(item);
        }
        return listPeople;
   
}
//create a class or you can use dictionary instead of list
        public class propleData
        {
            public string names { get; set; }
            public int years { get; set; }


        }

您可以通过迭代列表从列表中检索数据。我举个例子吧。

var namePeople = NamePeoples(people);
            string name = string.Empty;
            int year = 0;
            foreach (propleData propleData in namePeople)
            {
                name = propleData.names;
                year = propleData.years;

                // you can print or save the data to array
            }

【讨论】:

  • static (string, int) GetNamePeoplesAndYears(string[][] people) { foreach (var elements in people) { DateTime bitrthdayElement = ParseDate(elements[2]); var yearBirthday = bitrthdayElement.Year; var namePeople = elements[1]; } return (namePeople, yearBirthday); } 有一种方法应该从文件中获取所有值,并返回人的出生年份和姓名
  • 而你的方法,它检查今年的闰年和小于 20 年的差异,我无法以任何方式连接它们
  • static (string,int) NamePeoples(string[][] people) { string names = null; int years = 0; foreach (var elements in people) { DateTime bitrthdayElement = ParseDate(elements[2]); var yearBirthday = bitrthdayElement.Year; var namePeople = elements[1]; names = namePeople; years = yearBirthday; } return (names,years); } 这个工作但只返回最后一个结果
  • 您可以将 foreach 结果添加到列表中 吗?通过返回列表,您可以获得所需的所有数据
  • 这对我来说相当困难,但现在我会试着弄清楚
猜你喜欢
  • 2014-05-31
  • 2018-11-26
  • 2021-10-28
  • 2022-01-10
  • 2021-03-18
  • 1970-01-01
  • 2011-08-22
  • 2012-11-08
  • 1970-01-01
相关资源
最近更新 更多