【问题标题】:C# Find Data From A ListC# 从列表中查找数据
【发布时间】:2018-04-10 22:48:18
【问题描述】:

我有一个教师列表,我希望能够显示特定教师列表中的所有数据。我想按名字搜索。但是,要么我的列表为空,要么我无法从中获取数据。我不知道问题出在哪里。

这是我如何将数据从我的 sql server 数据库加载到我的列表中:

    public void connectDbRead(List<Teacher> Teachers)
    {
        var teacherData = TeacherData.GetInstance();
        //Get all students in the singleton
        var teachers = teacherData.Teachers;

        using (SqlConnection conn = new SqlConnection())
        {               
            conn.ConnectionString = "Server=DESKTOP;Database=Test;Trusted_Connection=true";
            conn.Open();

            SqlCommand command = new SqlCommand("SELECT * FROM TEACHERS", conn);
            command.Parameters.Add(new SqlParameter("0", 1));

            teachers.Clear();
            using (SqlDataReader reader = command.ExecuteReader())
            {                   
                while (reader.Read())
                {
                    teachers.Add(new Teacher
                    {
                        Name = (string)reader["NAME"],
                        FamilyName = (string)reader["FAMILY_NAME"],
                        Age = (int)reader["AGE"]                           
                    });

                    Console.WriteLine(String.Format("{0} | {1}| {2}",
                        reader[1], reader[2], reader[3]));
                }
            }              
        }
    }

这是我从列表中搜索数据的方式:

    public void searchTeacher(List<Teacher> Teachers)
    {       
        string teacherName = "";
        Console.WriteLine("Who do you want to find. Write his name: ");
        teacherName = Console.ReadLine();

        List<Teacher> teachers = Teachers.FindAll(x => x.Name == teacherName);

        Console.WriteLine("List Of ELements!");
        foreach (Teacher t in teachers)
        {
            Console.WriteLine(t.ToString());
        }
   }

我在 main 函数中这样调用它,但在 switch 情况下:

        var teacherData = TeacherData.GetInstance();
        var teachers = teacherData.Teachers;                
        teacherData.searchTeacher(teachers);                     
        teacherData.connectDbRead(teachers);

【问题讨论】:

  • 您是要进行部分比较还是完全匹配?外壳是一样的吗?也许你应该做teachers = Teachers.Where(t =&gt; string.Equals(t.Name, teacherName, StringComparison.OrdinalIgnoreCase)); 或者,如果你正在做一个parial search,那么.Where(t =&gt; t.IndexOf(teacherName, StringComparison.OrdinalIgnoreCase) &gt; -1)
  • 我想在列表中进行搜索,但仍为空。我只能获取整个列表,而不能删除或搜索数据。我试图应用你的代码,但它仍然不起作用: List newList = Teachers.FindAll(x => x.Name.Equals(teacherName));另外,我这样称呼它: foreach (Teacher t in newList) { Console.WriteLine(t.ToString()); }

标签: c# sql list singleton


【解决方案1】:

一条线解决方案(甚至不需要使用LINQ):

foreach(teachers t in Teacher)

  if (t.Name == "TeacherName or any searcj query")

    MessageBox.Show(t.name & t.age & .......)

或者,如果您仍想使用 LINQ:

 forech(Teachers t in Teacher)

  var result = Teachers.Where(Teacher => t.Name == "Name Here")

 /// use the result as u want )

【讨论】:

  • 问题是我认为这条线不起作用。它不识别教师中的任何数据: List teacher = Teachers.FindAll(x => x.Name == teacherName);
  • List&lt;Teacher&gt; Teachers,为什么你需要使用这个作为参数?这是废话,而是创建它的新实例,仅此而已:)
  • 是的,我宁愿使用 LINQ,但无论我做什么,列表仍然是空的: var result = Teachers.Where(Teacher => Teacher.name == teacherName); Console.WriteLine("元素列表!"); foreach (Teacher t in result) { Console.WriteLine(t.ToString()); }
  • 如果我这样做,我会从列表中获取所有数据: foreach (Teacher t in Teachers) { Console.WriteLine(t.ToString()); } 但是,我需要按名称搜索。
  • 仔细看,我输入了foreach(teachers t in Teacher)``if (t.name=="name here")console.WriteLine
【解决方案2】:

我改变了一些东西;删除了一些我看不懂的东西,但是我用这种方式测试过,它确实有效。

class Program
    {
        static List<Teacher> teachers = new List<Teacher>();
        static void Main(string[] args)
        {
            connectDbRead();
            searchTeacher();
            Console.ReadLine();
        }
        public static void connectDbRead()
        {
            using (SqlConnection conn = new SqlConnection("Server=DESKTOP;Database=Test;Trusted_Connection=true"))
            {
                conn.Open();
                SqlCommand command = new SqlCommand("SELECT * FROM TEACHERS", conn);

                teachers.Clear();
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        teachers.Add(new Teacher
                        {
                            Name = (string)reader["NAME"],
                            FamilyName = (string)reader["FAMILY_NAME"],
                            Age = (int)reader["AGE"]
                        });
                    }
                }
            }
        }
        public static void searchTeacher()
        {
            string teacherName = "";
            Console.WriteLine("Who do you want to find. Write his name: ");
            teacherName = Console.ReadLine();

            var foundTeachers = teachers.FindAll(x => x.Name == teacherName);

            Console.WriteLine("List Of ELements!");
            foreach (Teacher t in foundTeachers)
            {
                Console.WriteLine(String.Format("{0} | {1} | {2}", t.Name, t.FamilyName, t.Age));
            }
        }
    }
    public class Teacher
    {
        public int Age { get; set; }
        public string Name { get; set; }
        public string FamilyName  { get; set; }
    } 

【讨论】:

  • 对我来说还是不行。除非我这样做,否则我无法进入 foreach 循环:foreach (Teacher t in Teachers) {Console.WriteLine(t.ToString());},但这样我浏览了所有数据并且找不到特定的老师。
  • 您已经在表单级别声明了教师,是吗?并将List&lt;Teacher&gt; teachers = Teachers.FindAll(x =&gt; x.Name == teacherName); 更改为var foundTeachers = teachers.FindAll(x =&gt; x.Name == teacherName); 它确实适用于我使用的示例数据库。
猜你喜欢
  • 1970-01-01
  • 2021-10-22
  • 2021-03-14
  • 1970-01-01
  • 2022-07-11
  • 2015-07-10
  • 2016-09-01
  • 1970-01-01
  • 2013-03-10
相关资源
最近更新 更多