[英]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}");
}
我們正在存儲oldestAge
和oldestName
值,並檢查每個進來的人是否比oldestAge
——如果是,則設置oldestAge
和oldestName
。
該程序的示例運行如下所示:
Luke,25,Harry,32
Dan,33,Paul,75
Paul 75
首先,您應該創建一個名為Person
的 class,其中包含Name
和Age
作為屬性,例如
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();
現在您可以打印最年長者的Name
和Age
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
當然, regex101.com確實有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.