LINQ to Objects - не работает код. Ошибок нет, компилирует, но не ищет - C#
Формулировка задачи:
Не могу понять, почему не работает этот код
Ошибок не дает, компилирует, а не ищет
public void SurnameSearchLINQ()
{
string key;
Console.Write("Введите ключ для поиска: ");
key = Console.ReadLine();
var query = from Student stud in name
where stud.surname == key
where stud.faculty == key
select stud;
foreach (Student s in query)
Console.WriteLine(s.name + s.surname + s.faculty);
}Решение задачи: «LINQ to Objects - не работает код. Ошибок нет, компилирует, но не ищет»
textual
Листинг программы
using System.Runtime.InteropServices;
using System;
using System.IO;
using System.Collections;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;
using System.Collections.Generic;
using System.Linq;
/** Структура, яка забезпечує представлення дати у вигляді місяця і року
*
*/
struct yearMonth
{
public int month;
public int year;
}
/** Класс, який забезпечує існування ієрархії програми
*
*/
class ListOfVuz : ArrayList
{
}
/** Класс, який забезпечує представлення об'єктів типу ВУЗ
*
*/
public class Vuz : ArrayList
{
public string vuzName;
}
/** Класс, який забезпечує представлення об'єктів типу Студент
*
*/
[Serializable]
public class Student
{ /// Им'я студента
public string name;
/// Прізвище студента
public string surname;
/// Спеціальність студента
public string speciality;
/// Індекс групи студента
public string index;
/// Факультет студента
public string faculty;
/// День народження
public int dayOfBirth;
/// Місяць народження
public int monthOfBirth;
/// Рік народження
public int yearOfBirth;
/// День вступу
public int dayOfEnter;
/// Місяць вступу
public int monthOfEnter;
/// Рік вступу
public int yearOfEnter;
/// Успішність студента
public float progress;
/// Назва групи
public string group;
/// Номер семестру
public int semester;
/// Номер курсу
public int course;
public Student()
{ }
}
/** Класс, який забезпечує реалізацію всіх функцій
*
*/
class Functions
{
[DllImport("msvcrt")]
static extern int _getch();
public static int[] monthes = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
Vuz name = new Vuz();
public static void Serialize(ListOfVuz data, string file)
{
TextWriter x = new StreamWriter(file);
XmlSerializer q = new XmlSerializer(typeof(Student));
foreach (Vuz n in data)
foreach (Student k in n)
q.Serialize(x, k);
x.Close();
}
//public static void DeSerialize(string file)
//{
// Student i = new Student();
// TextReader x = new StreamReader(file);
// XmlSerializer q = new XmlSerializer(typeof(Student));
// //while (x.)
// i = (Student)q.Deserialize(x);
//}
///** Функція, яка забезпечує серіалізацію даних
// *
// */
//public static byte[] Serialize(Student reserve)
//{
// BinaryFormatter formatter = new BinaryFormatter();
// MemoryStream stream = new MemoryStream();
// formatter.Serialize(stream, reserve);
// return stream.ToArray();
//}
///** Функція, яка забезпечує десеріалізацію даних
// *
// */
//public Student ConverByteArreyToData(byte[] binaryData)
//{
// BinaryFormatter formatter = new BinaryFormatter();
// MemoryStream ms = new MemoryStream(binaryData);
// return (Student)formatter.Deserialize(ms);
//}
/** Функція, яка забезпечує введення даних з клавіатури до колекції
*
*/
public Student Input()
{
Student student = new Student();
Console.WriteLine("Введите имя:");
student.name = Console.ReadLine();
Console.WriteLine("Введите фамилию:");
student.surname = Console.ReadLine();
Console.WriteLine("Введите факультет:");
student.faculty = Console.ReadLine();
Console.WriteLine("Введите специальность:");
student.speciality = Console.ReadLine();
Console.WriteLine("Введите индекс группы:");
student.index = Console.ReadLine();
Console.WriteLine("Введите день рождения:");
student.dayOfBirth = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Введите месяц рождения:");
student.monthOfBirth = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Введите год рождения:");
student.yearOfBirth = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Введите день поступления:");
student.dayOfEnter = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Введите месяц поступления:");
student.monthOfEnter = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Введите год поступления:");
student.yearOfEnter = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Введите успеваемость студента (в процентах):");
student.progress = Convert.ToSingle(Console.ReadLine());
student.group = student.faculty + student.speciality + (student.yearOfEnter - 2010) + student.index;
student.course = (DateTime.Today.Year - student.yearOfEnter);
if (DateTime.Today.Month > 8)
student.course++;
student.semester = 1;
if (DateTime.Today.Month < 9)
student.semester++;
return student;
}
/** Функція, яка забезпечує виведення інформації на екран
*
*/
public void Show(Vuz z)
{
yearMonth x = new yearMonth();
Console.Clear();
foreach (Student stud in z)
{
x = Functions.countDate(stud.monthOfBirth, stud.yearOfBirth);
Console.WriteLine("Имя: {0} Фамилия: {1} Факультет:{2} \nСпециальность:{3} Индекс:{4} \nДата рождения:{5}.{6}.{7} \nДата поступления:{8}.{9}.{10} \nУспеваемость {11}% \nГруппа: {12} \nВозраст: {13} лет {14} месяцев\nКурс: {15}\nСеместр: {16}",
stud.name, stud.surname, stud.faculty, stud.speciality, stud.index, stud.dayOfBirth, stud.monthOfBirth, stud.yearOfBirth, stud.dayOfEnter, stud.monthOfEnter, stud.yearOfEnter, stud.progress, stud.group, x.year, x.month, stud.course, stud.semester);
Console.WriteLine();
}
_getch();
}
/** Функція, яка забезпечує додавання студентів до коллекції
*
*/
public int Add(Vuz first)
{
Console.Clear();
int StudCount;
Console.WriteLine("Введите количество студентов:");
StudCount = Convert.ToInt32(Console.ReadLine());
for (int i = 1; i <= StudCount; i++)
{
first.Add(Input());
}
return StudCount;
}
/** Функція, яка забезпечує пошук у колекції по прізвищу
*
*/
public void SurnameSearch(Vuz first)
{
Console.Clear();
string key;
Console.Write("Введите фамилию студента: ");
key = Console.ReadLine();
byte found = 0;
foreach (Student stud in first)
{
if (stud.surname == key)
{
Console.WriteLine("\nТакой студент существует в этом вузе:");
found++;
Console.WriteLine("\nИмя: {0} Фамилия: {1} Факультет:{2} \nСпециальность:{3} Индекс:{4} \nДата рождения:{5}.{6}.{7} \nДата поступления:{8}.{9}.{10} \nУспеваемость {11}% \nГруппа {12} ",
stud.name, stud.surname, stud.faculty, stud.speciality, stud.index, stud.dayOfBirth, stud.monthOfBirth, stud.yearOfBirth, stud.dayOfEnter, stud.monthOfEnter, stud.yearOfEnter, stud.progress, stud.group);
}
}
if (found == 0)
Console.WriteLine("Такой студент не существует в этом вузе!");
_getch();
}
/** Функція, яка забезпечує пошук у колекції по назві групи
*
*/
public void GroupSearch(Vuz first)
{
Console.Clear();
string key;
Console.Write("Введите группу: ");
key = Console.ReadLine();
int found = 0;
int summAge = 0;
float summProgress = 0;
int currentIndex = 0;
var indexes = new List<int>();
foreach (Student stud in first)
{
if (stud.group == key)
{
found++;
indexes.Add(currentIndex);
summAge = summAge + Functions.countDate(stud.monthOfBirth, stud.yearOfBirth).year;
summProgress = summProgress + stud.progress;
Console.WriteLine("Имя: {0} Фамилия: {1} Факультет: {2} \nСпециальность: {3} \nУспеваемость {4}% ",
stud.name, stud.surname, stud.faculty, stud.speciality, stud.progress);
}
currentIndex++;
}
Console.WriteLine("Удалить данные по всей группе? (y/n)");
char ch = Console.ReadKey().KeyChar;
while (ch != 'n' || ch != 'y')
{
switch (ch)
{
case 'n':
break;
case 'y':
foreach (int index in indexes)
{
first.RemoveAt(index);
}
break;
case 'q':
return;
}
ch = Console.ReadKey().KeyChar;
}
if (found == 0)
Console.WriteLine("Такой студент не существует в этом вузе!");
else Console.WriteLine("Средний возраст:{0}, Средняя успеваемость: {1}", summAge / found, summProgress / found);
_getch();
}
/** Функція, яка забезпечує пошук у колекції по спеціальності
*
*/
public void SpecSearch(Vuz first)
{
Console.Clear();
string key;
int summAge = 0;
float summProgress = 0;
Console.Write("Введите специальность: ");
key = Console.ReadLine();
byte found = 0;
foreach (Student stud in first)
{
if (stud.speciality == key)
{
found++;
summAge = summAge + Functions.countDate(stud.monthOfBirth, stud.yearOfBirth).year;
summProgress = summProgress + stud.progress;
Console.WriteLine("\nИмя: {0} Фамилия: {1} Факультет:{2} \nСпециальность:{3} \nУспеваемость {4}% ",
stud.name, stud.surname, stud.faculty, stud.speciality, stud.progress);
}
}
if (found == 0)
Console.WriteLine("Такая специальность не существует в этом вузе!");
else Console.WriteLine("Средний возраст:{0}, Средняя успеваемость: {1}", summAge / found, summProgress / found);
_getch();
}
/** Функція, яка забезпечує пошук у колекції по назві факультета
*
*/
public void FacSearch(Vuz first)
{
Console.Clear();
string key;
Console.Write("Введите факультет: ");
key = Console.ReadLine();
byte found = 0;
int summAge = 0;
float summProgress = 0;
foreach (Student stud in first)
{
if (stud.faculty == key)
{
//Console.WriteLine("\nТакой факультет существует в этом вузе:");
found++;
summAge = summAge + Functions.countDate(stud.monthOfBirth, stud.yearOfBirth).year;
summProgress = summProgress + stud.progress;
Console.WriteLine("\nИмя: {0} Фамилия: {1} Факультет:{2} \nСпециальность:{3} \nУспеваемость {4}% ",
stud.name, stud.surname, stud.faculty, stud.speciality, stud.progress);
}
}
if (found == 0)
Console.WriteLine("Такой факультет не существует в этом вузе!");
else Console.WriteLine("Средний возраст:{0}, Средняя успеваемость: {1}", summAge / found, summProgress / found);
_getch();
}
/** Функція, яка забезпечує збереження даних у текстовий файл
*
*/
public void Save(ListOfVuz second)
{
StreamWriter fs = new StreamWriter("E:\\file.txt");
Console.Clear();
foreach (Vuz first in second)
{
fs.WriteLine("{0}", first.vuzName);
fs.WriteLine("{0}", first.Count);
foreach (Student stud in first)
{
fs.WriteLine("{0} {1} {2} {3} {4} {5}.{6}.{7} {8}.{9}.{10} {11} {12} {13} {14} ",
stud.name, stud.surname, stud.faculty, stud.speciality, stud.index, stud.dayOfBirth, stud.monthOfBirth, stud.yearOfBirth, stud.dayOfEnter, stud.monthOfEnter, stud.yearOfEnter, stud.progress, stud.group, stud.course, stud.semester);
}
}
fs.Close();
_getch();
}
/** Функція, яка забезпечує зчитування даних з текстового файлу та лолавання їх у існуючу колекцію
*
*/
public void Read(ListOfVuz first)
{
first.Clear();
Vuz q = new Vuz();
string[] Vname;
string[] strArr;
string[] fifth;
string readed;
int studCount;
StreamReader fs = new StreamReader("E:\\file.txt");
Console.Clear();
while (fs.EndOfStream != true)
{
studCount = Convert.ToInt32(fs.ReadLine());
for (int i = 0; i < studCount; i++)
{
q.vuzName = fs.ReadLine();
Vname = q.vuzName.Split(' ');
q.vuzName = Vname[0];
}
for (int i = 0; i < studCount; i++)
{
Student stud = new Student();
readed = fs.ReadLine();
strArr = readed.Split(' ');
stud.name = strArr[0];
stud.surname = strArr[1];
stud.faculty = strArr[2];
stud.speciality = strArr[3];
stud.index = strArr[4];
fifth = strArr[5].Split('.');
stud.dayOfBirth = Convert.ToInt32(fifth[0]);
stud.monthOfBirth = Convert.ToInt32(fifth[1]);
stud.yearOfBirth = Convert.ToInt32(fifth[2]);
fifth = strArr[6].Split('.');
stud.dayOfEnter = Convert.ToInt32(fifth[0]);
stud.monthOfEnter = Convert.ToInt32(fifth[1]);
stud.yearOfEnter = Convert.ToInt32(fifth[2]);
stud.progress = Convert.ToSingle(strArr[7]);
stud.group = strArr[8];
stud.course = Convert.ToInt32(strArr[9]);
stud.semester = Convert.ToInt32(strArr[10]);
//q.vuzName = strArr[11];
q.Add(stud);
}
first.Add(q);
}
fs.Close();
_getch();
}
/** Функція, яка забезпечує редагування даних елементу колекції
*
*/
public void Edit(Vuz first)
{
Console.WriteLine("Введите фамилию для редактирования: ");
string key = Console.ReadLine();
int number = -1;
foreach (Student stud in first)
{
number++;
if (stud.surname == key)
{
Console.WriteLine("Имя: {0} Фамилия: {1} Факультет:{2} \nСпециальность:{3} Индекс:{4} \nДата рождения:{5}.{6}.{7} \nДата поступления:{8}.{9}.{10} \nУспеваемость {11}% \nГруппа: {12}",
stud.name, stud.surname, stud.faculty, stud.speciality, stud.index, stud.dayOfBirth, stud.monthOfBirth, stud.yearOfBirth, stud.dayOfEnter, stud.monthOfEnter, stud.yearOfEnter, stud.progress, stud.group);
Console.WriteLine();
Console.WriteLine("Редактировать? 0 - нет, 1 - да");
int answer = Convert.ToInt32(Console.ReadLine());
if (answer == 1)
{
first.RemoveAt(number);
// Редактирование студента
Console.WriteLine("Фамилия: ");
stud.surname = Console.ReadLine();
Console.WriteLine("Имя: ");
stud.name = Console.ReadLine();
Console.WriteLine("Факультет: ");
stud.faculty = Console.ReadLine();
Console.WriteLine("Специальность: ");
stud.speciality = Console.ReadLine();
Console.WriteLine("Индекс группы: ");
stud.index = Console.ReadLine();
Console.WriteLine("День рождения: ");
stud.dayOfBirth = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Месяц рождения: ");
stud.monthOfBirth = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Год рождения: ");
stud.yearOfBirth = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("День поступления: ");
stud.dayOfEnter = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Месяц поступления : ");
stud.monthOfEnter = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Год поступления: ");
stud.yearOfEnter = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Успеваемость: ");
stud.progress = Convert.ToSingle(Console.ReadLine());
first.Add(stud);
return;
}
else continue;
}
}
Console.WriteLine("Такой студент не существует");
}
/** Функція, яка забезпечує видалення елементу колекції
*
*/
public void Remove(Vuz first)
{
Console.WriteLine("Введите фамилию студента для удаления его данных: ");
string key = Console.ReadLine();
int number = -1;
foreach (Student stud in first)
{
number++;
if (stud.surname == key)
{
Console.WriteLine("Имя: {0} Фамилия: {1} Факультет:{2} \nСпециальность:{3} Индекс:{4} \nДата рождения:{5}.{6}.{7} \nДата поступления:{8}.{9}.{10} \nУспеваемость {11}% \nГруппа: {12}",
stud.name, stud.surname, stud.faculty, stud.speciality, stud.index, stud.dayOfBirth, stud.monthOfBirth, stud.yearOfBirth, stud.dayOfEnter, stud.monthOfEnter, stud.yearOfEnter, stud.progress, stud.group);
Console.WriteLine();
Console.WriteLine("Вы хотите удалить данные этого студента? 0 - нет, 1 - да");
int answer = Convert.ToInt32(Console.ReadLine());
if (answer == 1)
{
first.RemoveAt(number);
return;
}
else continue;
}
}
Console.WriteLine("Такой студент не существует");
}
/** Функція, яка забезпечує представлення представлення одного з підпунктів меню
*
*/
public void MainMenu(ListOfVuz l)
{
bool ques = false;
Console.Clear();
while (true)
{
Console.WriteLine("Меню:\n\t1 - Добавить новый ВУЗ\n\t2 - Сохранить данные ВУЗа\n\t3 - Прочитать данные ВУЗа из файла\n\t4 - Редактирование данных ВУЗа\n\t5 - Выход\n\t6 - Сериализация");
int key = Convert.ToChar(_getch());
switch (key)
{
case '1':
Vuz f = new Vuz();
Console.WriteLine("Введите название ВУЗа:");
f.vuzName = Console.ReadLine();
l.Add(f);
break;
case '2':
Save(l);
break;
case '3':
Read(l);
break;
case '4':
Console.WriteLine("Введите название ВУЗа:");
string nameOfVuz = Console.ReadLine();
foreach (Vuz t in l)
{
if (nameOfVuz == t.vuzName)
{
Menu(t);
ques = true;
Console.Clear();
}
}
if (ques == false)
Console.WriteLine("ВУЗ не найден");
break;
case '5':
Environment.Exit(0);
break;
case '6':
Functions.Serialize(l, @"E:\name.xml");
break;
//case '7':
// Functions.DeSerialize(@"E:\name.xml");
// break;
}
}
}
/** Функція, яка забезпечує вирахування віку студента
*
*/
public static yearMonth countDate(int monthOfBirth, int yearOfBirth)
{
/// Поточна дата
System.DateTime date = DateTime.Now;
yearMonth q = new yearMonth();
//int day = date.Day;
int month = date.Month;
int year = date.Year;
//int day1;
int month1;
int year1;
int borrow;
month1 = month - monthOfBirth;
if (month1 < 0)
{
month1 = 12 + month1;
borrow = 1;
}
else borrow = 0;
year1 = year - yearOfBirth - borrow;
q.month = month1;
q.year = year1;
return q;
}
/** Функція, яка забезпечує представлення представлення одного з підпунктів меню
*
*/
public void Search(Vuz k)
{
while (true)
{
Console.Clear();
Console.WriteLine("\t1 - Поиск по фамилии\n\t2 - Поиск по группе\n\t3 - Поиск по специальности\n\t4 - Поиск по факультету\n\t5 - Вернуться");
int key = Convert.ToChar(_getch());
switch (key)
{
case '1':
SurnameSearch(k);
break;
case '2':
GroupSearch(k);
break;
case '3':
SpecSearch(k);
break;
case '4':
FacSearch(k);
break;
case '5':
return;
}
}
}
/** Функція, яка забезпечує представлення інтерактивного меню
*
*/
public void Menu(Vuz k)
{
while (true)
{
Console.Clear();
Console.WriteLine("Меню:\n\t1 - Добавить\n\t2 - Показать\n\t3 - Поиск\n\t4 - Редактирование\n\t5 - Удаление\n\t6 - Возврат в основное меню");
// по фамилии\n\t4 - Поиск по группе\n\t5 - Поиск по специальности\n\t6 - Поиск по факультету
int key = Convert.ToChar(_getch());
switch (key)
{
case '1':
Add(k);
break;
case '2':
Show(k);
break;
case '3':
//Search
SurnameSearchLINQ();
break;
case '4':
Edit(k);
break;
case '5':
Remove(k);
break;
case '6':
return;
}
}
}
public void SurnameSearchLINQ()
{
string key;
Console.Write("Введите ключ для поиска: ");
key = Console.ReadLine();
var query = from Student stud in name
where stud.surname == key
//where stud.faculty == key
select stud;
foreach (Student s in query)
Console.WriteLine(s.name + s.surname + s.faculty);
}
public void Linq(Vuz k)
{
var query = from Student student in name
where student.progress > 50
select student;
foreach (Student s in query)
Console.WriteLine(s.name + ": " + s.progress);
}
}
/** Класс, який забезпечує представлення функції Main()
*
*/
class Sample
{
static void Main()
{
Functions prog = new Functions();
ListOfVuz list = new ListOfVuz();
prog.MainMenu(list);
}
}