如何在找到关键元素后从列表中获取下一个元素

时间:2015-02-23 12:37:48

标签: c# linq

场景:我有一个学生列表,其中包含姓名(不同)和标记。用户输入名称后,我必须在控制台应用程序中显示相应的标记。如何在名称之后获得下一个元素。

实施例: //用户输入如下:

rice 
50
john
60
pat
70

//如果用户输入“john”,那么 - 60 //应该显示

使用LINQ我找到了列表中的关键元素

var item = students.Find(x => x.Name == keyname);

5 个答案:

答案 0 :(得分:2)

假设你有一个班级:

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}
};

你想得到斯蒂芬的印记:

Student stephen = students.FirstOrDefault(s=> s.Name == "Stephen"); //if you have an unique property i you can use .SingleOrDefault in the same manner
if(stephen != null) //could be that the student is not even in the list
{
     int markofStephen = stephen.Mark;
}

现在可以输入这个新的DataType:

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)

答案 1 :(得分:1)

执行以下代码:

var itemIndex = students.IndexOf(keyname);

然后该值的索引将为var value = students.ElementAt(itemIndex+1);

答案 2 :(得分:1)

看看OOP http://www.codeproject.com/Articles/22769/Introduction-to-Object-Oriented-Programming-Concep

然后你可以创建一个定义大米和50的类或结构。

public class Student
{
   public string Name {get;set;}
   public double Mark {get;set;}
}

然后通过Console您可以构建一个新学生,然后将其存储在列表中

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);

使用类或结构可以更好地控制将所有值存储在列表或数组中

答案 3 :(得分:0)

你将得分和名字保存在同一个列表中,所以我认为两者都是字符串。在我的实现中,我获取名称和分数列表,每两个项目,创建一个元组,并在元组列表上搜索一个第一项与您的键匹配并返回第二项(分数):

List<string> testList = new List<string> { "rice", "50", "john", "60", "pat", "70" };
string myKey = "rice";

var result =
    testList.Zip(testList.Skip(1), (a, b) => Tuple.Create(a, b))
            .Where(t => t.Item1 == myKey)
            .First()
            .Item2;

或者您可以使用匿名类型而不是元组:

var result =
    testList.Zip(testList.Skip(1), (a, b) => new {Name = a, Score = b})
            .Where(t => t.Name == myKey)
            .First()
            .Score;

当然,假设每个名字旁边都有匹配的分数(因为这是你问题中描述的条件)。

答案 4 :(得分:0)

这应该有效

var item = students.SkipWhile(x => x.Name != keyname).Skip(1).FirstOrDefault();