[英]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.