簡體   English   中英

如何從字符串中獲取最大值 Split() c#

[英]How to get highest value from string Split() c#

所以我想打印最老的人的年齡(例如人寫:Patrick,50 Steven,25)代碼將打印:最老的年齡:年齡

顯然這是一個練習,我不想隱藏它

這是代碼的基礎:

while (true)
            {
                string input = Console.ReadLine();

                if (input == "")
                {
                    break;
                }

                string[] pieces = input.Split(",");

你可以這樣做:

    public static void Main(string[] args)
    {
        var oldestAge = 0;
        var oldestName = "";
    
        while (true)
        {
            string input = Console.ReadLine();

            if (input == "")
            {
                break;
            }

            string[] pieces = input.Split(",");


            for (var i = 0; i < pieces.Length; i += 2)
            {
                var name = pieces[i]; 
                var age = int.Parse(pieces[i + 1]);
                if (age > oldestAge)
                {
                    oldestAge = age;
                    oldestName = name;
                }
            }
         
        }
        Console.WriteLine($"{oldestName} {oldestAge}");
    }

我們正在存儲oldestAgeoldestName值,並檢查每個進來的人是否比oldestAge ——如果是,則設置oldestAgeoldestName

該程序的示例運行如下所示:

Luke,25,Harry,32
Dan,33,Paul,75

Paul 75

首先,您應該創建一個名為Person的 class,其中包含NameAge作為屬性,例如

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; } = 0;

    public Person(string name, string ageStr)
    {
      this.Name = name;
      int.TryParse(ageStr, out this.Age);
    }
}

拆分字符串后,創建人員列表Person並添加每個人的詳細信息,

List<Person> people = new List<Person>();
for(int i = 0; i < pieces.Length; i = i + 2) //look at increment, jumping i by 2
{
    var person = new Person(pieces[i], pieces[i + 1]);
    people.Add(person);
}

現在使用 Linq, OrderByDescending() & First()獲得第一高記錄,

var eldestPerson = people.OrderByDescending(x => x.Age).First();

現在您可以打印最年長者的NameAge

Console.WriteLine($"Eldest Person Name: {eldestPerson.Name} Age: {eldestPerson.Age}");

您正在做一項非常困難的練習:我建議您開始使用年齡列表並獲得最高的年齡,例如:

20, 50, 35, 15, 20
=> the result should be 50.

獲得此權限后,您就可以開始將名稱添加到列表中:

Alice, 20, Bjorn, 50, Charlie, 35, Dave, 15, Evelyn, 20
=> First thing to realise is that not all entries are numbers (the question "Is Charlie larger than 35?" makes no sense),
   so you need to find a way to check if the entry is a name or a number.
=> the result should be 50.

現在您會對實際 50 歲的人感興趣。 您可以通過再次運行您的列表並獲取之前的條目來完成此操作。

=> the result should be "Bjorn".

然后你可能會開始想:為了知道年齡最大的人,我遍歷列表兩次:一次是為了知道最高年齡,一次是為了知道這是誰的年齡,你意識到你最好保持您要查找的最高年齡的索引,這樣您就可以使用該索引來檢索相應的名稱,而無需再次遍歷您的列表。

玩得開心

假設輸入字符串的格式與您提到的完全相同,您可以嘗試以下操作:

string[] pieces = input.Split(',');
var oldestAge = pieces.Select( (piece, i) =>
                                 i > 0 ? int.Parse(piece.Split(' ')[0]) : int.MinValue
                                 ).Max();
Console.WriteLine(oldestAge);

您可以使用 System.Linq 中的Enumerable.Max從列表中獲取最大值。

一個例子:

var ages = new string[4];
ages[0] = "10";
ages[1] = "45";
ages[2] = "55";
ages[3] = "100";

var highest = ages.ToList().Select(a => Convert.ToInt32(a)).Max();
Console.WriteLine(highest); //Prints out 100 to console

我也需要在 C# 鍛煉一下。 這是我的解決方案:

using System.Text.RegularExpressions;

string pattern = @"([0-9]+)|([a-zA-Z]+)";
string input = @"Patrick,50 Steven,25 Dirk,50";
RegexOptions options = RegexOptions.Multiline;

Dictionary<string, uint> persons = new Dictionary<string, uint>();

string name = "";
uint age = 0;
foreach (Match m in Regex.Matches(input, pattern, options))
{
    uint.TryParse(m.Value, out age);
    if (age == 0)
    {
        name = m.Value;
    }
    else
    {
        persons.Add(name, age);
    }
}

uint maxAge = persons.Values.Max();

foreach (var p in persons.Where(x => x.Value == maxAge))
{
    Console.WriteLine($"{p.Key} {p.Value}");
}

output:

Patrick 50
Dirk 50
  • 到目前為止,這是唯一可以檢測到多個具有 maxAge 的人的解決方案?

當然, regex101.com確實有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM