场景:我有一个学生列表,其中包含姓名(不同)和标记。用户输入名称后,我必须在控制台应用程序中显示相应的标记。如何在名称之后获得下一个元素。
实施例: //用户输入如下:
rice
50
john
60
pat
70
//如果用户输入“john”,那么 - 60 //应该显示
使用LINQ我找到了列表中的关键元素
var item = students.Find(x => x.Name == keyname);
答案 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();