繁体   English   中英

C# 将项目添加到列表会导致重复

[英]C# Adding items to list causes duplicates

我想做一个循环,将一个对象添加到列表中。 每当我这样做时,它似乎一直在添加相同的对象。

private List<Events> GetEvents()
        {
            List<Events> dataEvents = new List<Events>();
            MySqlConnection con = new MySqlConnection(cs);
            con.Open();
            string sql = "SELECT * FROM Events";
            var cmd = new MySqlCommand(sql, con);
            MySqlDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                Events x = new Events(rdr.GetInt32(0), rdr.GetString(1), rdr.GetInt32(2), rdr.GetInt32(3), rdr.GetDateTime(4));
                dataEvents.Add(x);
            }

            con.Close();
            return dataEvents;
        }

List<Events> newEvent = GetEvents();

下面是我如何构建我的 Events 类:

public class Events
    {
        private static int _ID;
        private static string _Type;
        private static int _UserID;
        private static int _LokaalID;
        private static DateTime _Created_On;
        public Events(int id, string type, int UserID, int LokaalID, DateTime Created_On)
        {
            _ID = id;
            _Type = type;
            _UserID = UserID;
            _LokaalID = LokaalID;
            _Created_On = Created_On;
        }


    public int ID { get { return _ID; } }
    public string Type { get { return _Type; } }
    public int UserID { get { return _UserID; } }
    public int LokaalID { get { return _LokaalID; } }
    public DateTime Created_On { get { return _Created_On; } }

    }

列表中对象的屏幕截图或检查下面

  •  [0] ID 38 int LokaalID 1 int Type "check_in" string UserID 114 int
  •  [1] ID 38 int LokaalID 1 int Type "check_in" string UserID 114 int
  •  [2] ID 38 int LokaalID 1 int Type "check_in" string UserID 114 int

这是我的数据库的样子,因此您可以看到它在我的数据库中没有重复:

数据库内容截图

Laurent 做到了; 永远不要使用static除非你确切地知道它的用途..让你的事件看起来像这样:

public class Events
{

    public Events(int id, string type, int UserID, int LokaalID, DateTime Created_On)
    {
        ID = id;
        Type = type;
        UserID = UserID;
        LokaalID = LokaalID;
        Created_On = Created_On;
    }


    public int ID { get; set; }
    public string Type { get; set; }
    public int UserID { get; set; }
    public int LokaalID  { get; set; }
    public DateTime Created_On  { get; set; }

}

但是一旦你解决了这个问题,试试这个; 以后你可能会因为不同的原因感谢我!

  • 打开项目的 NuGet 包管理器,

  • 搜索小巧玲珑在此处输入图片说明

  • 安装它并将以下代码放入您的应用程序中:

        private List<Events> GetEvents()
        {
            using var con = new MySqlConnection(cs);
            return conn.Query<Event>("SELECT * FROM Events").ToList();
        }

是的.. 这就是你所要做的*; Dapper 将创建对象、打开/关闭连接、读取数据、将其填充到对象中等等。

*好了,除非你的C#属性名称不与列名称保持一致,在这种情况下,使用AS所以他们的比赛重新命名列:

//assume the column is called EventId and the C# prop is ID
conn.Query<Event>("SELECT EventId as ID, ... FROM Events").ToList()

要进行参数化查询:

conn.Query<Event>("SELECT * FROM Events WHERE ID = @someId", new { someId = 123 }).ToList()

它确实负载更多,但这应该让您开始,并且意味着您不必花费数小时编写最乏味的GetInt, GetString, Get.. Get..人类已知的代码..

您的事件类具有静态的私有字段,因此这些字段的值对于您的所有事件实例都是通用的……

这将是正确的代码。 它可以简化,具体取决于您使用的 .NET 版本。

public class Events
{
    private int _ID;
    private string _Type;
    private int _UserID;
    private int _LokaalID;
    private DateTime _Created_On;
    public Events(int id, string type, int UserID, int LokaalID, DateTime Created_On)
    {
        _ID = id;
        _Type = type;
        _UserID = UserID;
        _LokaalID = LokaalID;
        _Created_On = Created_On;
    }


    public int ID { get { return _ID; } }
    public string Type { get { return _Type; } }
    public int UserID { get { return _UserID; } }
    public int LokaalID { get { return _LokaalID; } }
    public DateTime Created_On { get { return _Created_On; } }
}

编写此代码的现代方式(C# 9)是

public class Events
{
    public int ID { get; init; }
    public string Type { get; init; }
    public int UserID { get; init; }
    public int LokaalID { get; init; }
    public DateTime Created_On { get; init; }
}

旁注:当你的类为一个事件建模时,为什么称它为事件?

从您的字段中删除静态修饰符:

public class Events
{
    private int _ID;
    private string _Type;
    private int _UserID;
    private int _LokaalID;
    private DateTime _Created_On;

    public Events(int id, string type, int UserID, int LokaalID, DateTime Created_On)
    {
        _ID = id;
        _Type = type;
        _UserID = UserID;
        _LokaalID = LokaalID;
        _Created_On = Created_On;
    }


    public int ID { get { return _ID; } }
    public string Type { get { return _Type; } }
    public int UserID { get { return _UserID; } }
    public int LokaalID { get { return _LokaalID; } }
    public DateTime Created_On { get { return _Created_On; } }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM