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