C# 如何在找到关键元素后从列表中获取下一个元素
场景:我有一个学生名单,包括姓名(不同)和分数。一旦用户输入名称,我就必须在控制台应用程序中显示相应的标记。如何在确定名称后获取下一个元素 例如: //用户输入如下内容:C# 如何在找到关键元素后从列表中获取下一个元素,c#,linq,C#,Linq,场景:我有一个学生名单,包括姓名(不同)和分数。一旦用户输入名称,我就必须在控制台应用程序中显示相应的标记。如何在确定名称后获取下一个元素 例如: //用户输入如下内容: rice 50 john 60 pat 70 //如果用户输入“john”,则-- 60//应该显示 使用LINQ,我在列表中找到了关键元素 var item = students.Find(x => x.Name == keyname); 执行以下代码: var itemIndex=students.IndexO
rice
50
john
60
pat
70
//如果用户输入“john”,则--
60//应该显示
使用LINQ,我在列表中找到了关键元素
var item = students.Find(x => x.Name == keyname);
执行以下代码:
var itemIndex=students.IndexOf(keyname)代码>
然后该值的索引将是var value=students.ElementAt(itemIndex+1)代码>执行以下代码:
var itemIndex=students.IndexOf(keyname)代码>
然后该值的索引将是var value=students.ElementAt(itemIndex+1)代码>假设您有一个类:
public class Student
{
public string Name {get;set;}
public int Mark {get;set;}
}
您的列表如下所示:
List<Student> students = new List<Student>
{
new Student{Name = "Markus", Mark = 2},
new Student{Name = "Stephen", Mark = 1}
};
现在,要输入此新数据类型,您可以执行以下操作:
List<Student> students = new List<Student>()
do
{
Console.Write("Please enter the Name of the Student(enter \"finish\" to exit):");
string name = Console.ReadLine();
if(name.ToLower() == "finish" )
break;
bool validMark = false;
do
{
Console.Write("Please enter the Mark of {0}:", name);
string markString = Console.ReadLine();
int mark;
validMark = int.TryParse(markString,out mark);
if(!validMark)
Console.WriteLine("Invalid Number Entered");
else
students.Add(new Student{Name=name, Mark = mark});
} while (!validMark)
} while (true)
List学生=新列表()
做
{
控制台。写入(“请输入学生姓名(输入\“完成\”退出):”;
字符串名称=Console.ReadLine();
if(name.ToLower()=“finish”)
打破
bool validMark=false;
做
{
编写(“请输入{0}的标记:”,名称);
字符串markString=Console.ReadLine();
整数标记;
validMark=int.TryParse(markString,out mark);
如果(!validMark)
Console.WriteLine(“输入的号码无效”);
其他的
Add(新学生{Name=Name,Mark=Mark});
}而(!validMark)
}while(true)
假设您有一个类:
public class Student
{
public string Name {get;set;}
public int Mark {get;set;}
}
您的列表如下所示:
List<Student> students = new List<Student>
{
new Student{Name = "Markus", Mark = 2},
new Student{Name = "Stephen", Mark = 1}
};
现在,要输入此新数据类型,您可以执行以下操作:
List<Student> students = new List<Student>()
do
{
Console.Write("Please enter the Name of the Student(enter \"finish\" to exit):");
string name = Console.ReadLine();
if(name.ToLower() == "finish" )
break;
bool validMark = false;
do
{
Console.Write("Please enter the Mark of {0}:", name);
string markString = Console.ReadLine();
int mark;
validMark = int.TryParse(markString,out mark);
if(!validMark)
Console.WriteLine("Invalid Number Entered");
else
students.Add(new Student{Name=name, Mark = mark});
} while (!validMark)
} while (true)
List学生=新列表()
做
{
控制台。写入(“请输入学生姓名(输入\“完成\”退出):”;
字符串名称=Console.ReadLine();
if(name.ToLower()=“finish”)
打破
bool validMark=false;
做
{
编写(“请输入{0}的标记:”,名称);
字符串markString=Console.ReadLine();
整数标记;
validMark=int.TryParse(markString,out mark);
如果(!validMark)
Console.WriteLine(“输入的号码无效”);
其他的
Add(新学生{Name=Name,Mark=Mark});
}而(!validMark)
}while(true)
看看OOP
然后您可以创建一个类或结构来定义rice和50
i、 e
然后通过控制台,您可以构造一个新的学生,然后将其存储在列表中
var item = students.Where(x => x.Name == keyname).Select(x=>x.Mark).FirstOrDefault();
Console.WriteLine(item);
//or
var item = students.Where(x => x.Name == keyname).FirstOrDefault();
if (item != null)
Console.WriteLine(item.Mark);
//or
var item = students.FirstOrDefault(s=> s.Name == keyname);
if (item != null)
Console.WriteLine(item.Mark);
使用类或结构可以实现更好的控制,将所有值存储在列表或数组中
然后您可以创建一个类或结构来定义rice和50
i、 e
然后通过控制台,您可以构造一个新的学生,然后将其存储在列表中
var item = students.Where(x => x.Name == keyname).Select(x=>x.Mark).FirstOrDefault();
Console.WriteLine(item);
//or
var item = students.Where(x => x.Name == keyname).FirstOrDefault();
if (item != null)
Console.WriteLine(item.Mark);
//or
var item = students.FirstOrDefault(s=> s.Name == keyname);
if (item != null)
Console.WriteLine(item.Mark);
使用类或结构可以实现更好的控制,即将所有值存储在列表或数组中,将分数和名称保存在同一个列表中,因此我假设两者都是字符串。在我的实现中,我获取名称和分数的列表,每2项获取一个,创建一个元组,在元组列表中搜索第一项与键匹配的元组,并返回第二项(分数):
当然,假设每个名字旁边都有一个匹配的分数(这是您问题中描述的条件)。您将分数和名字放在同一个列表中,因此我假设两者都是字符串。在我的实现中,我获取名称和分数的列表,每2项获取一个,创建一个元组,在元组列表中搜索第一项与键匹配的元组,并返回第二项(分数):
当然,假设每个名字旁边都有一个匹配的分数(这是您问题中描述的条件)。这应该是可行的
var item = students.SkipWhile(x => x.Name != keyname).Skip(1).FirstOrDefault();
这应该行得通
var item = students.SkipWhile(x => x.Name != keyname).Skip(1).FirstOrDefault();
var item=students.Where(x=>x.Name==keyname)。选择(x=>x.Where)代码>您真的应该将输入格式化为结构。i、 e.输入一个名称,输入一个数字,然后创建并初始化一个具有名称和年龄组件的类对象。我将使用字典。var item=students.Where(x=>x.name==keyname)。选择(x=>x.Whatever)代码>您真的应该将输入格式化为结构。i、 输入一个名称,输入一个数字,然后创建并初始化一个具有名称和年龄组件的类对象。我将使用字典。这有助于解决问题。我变了一点。私有静态void displaytstudentmark(){Console.WriteLine(“输入学生名称”);string temp=Console.ReadLine();student student=students.Where(s=>s.name==temp.FirstOrDefault();if(stud!=null){Console.WriteLine(“+temp+”的标记为:{0}”.PadLeft(10),stud.Mark);}else{Console.WriteLine(“学生:{0}不存在”,temp);}@Pat FirstOrDefault有一个重载,它接受一个谓词,因此您可以像我一样简化语句。无需在之前调用.Where(),它可以帮助我解决问题。我变了一点。私有静态void displaytstudentmark(){Console.WriteLine(“输入学生名称”);string temp=Console.ReadLine();student student=students.Where(s=>s.name==temp.FirstOrDefault();if(stud!=null){Console.WriteLine(“+temp+”的标记为:{0}”.PadLeft(10),stud.Mark);}else{Console.WriteLine(“学生:{0}不存在”,temp);}@Pat FirstOrDefault有一个重载,它接受一个谓词,因此您可以像我一样简化语句。无需调用.Where()bef