0

我从数据库中查询两个表并将唯一值添加到通用列表中。

如果有一个我不想添加到列表中的值,我该如何防止该项目被添加?

using (myOledbConn = new OleDbConnection(connAccessLrProduct))
        {
            List<string> lst = new List<string>();
            myOledbConn.Open();
            OleDbCommand cmd = myOledbConn.CreateCommand();
            cmd.CommandText = @"SELECT tblProducts.CODE, tblSubject.SUBJECT, tblProducts.GenSubject
                               FROM tblSubject INNER JOIN tblProducts ON tblSubject.ID = tblProducts.SubjectID
                               WHERE [SUBJECT] = 'Arts' or [SUBJECT] = 'Aged Care';";


            OleDbDataReader dbReader = cmd.ExecuteReader();
            while (dbReader.Read())
            {
                string generalSublject;
                string subject = (string)dbReader["SUBJECT"];
                if (lst.Where(t => t == subject).Count() == 0)
                    lst.Add(subject);
                if (dbReader["GenSubject"] != DBNull.Value)
                {
                    generalSublject = (string)dbReader["GenSubject"];
                    if(generalSublject.Equals("No related topics"))
                    {
                        //how do I exclude this item from being added to the list?
                    }
                    if (lst.Where(t => t == generalSublject).Count() == 0)
                        lst.Add(generalSublject);
4

1 回答 1

1

我建议您使用 aISet<T>而不是 a List<T>,这使元素对您来说是独一无二的。然后,您可以决定是否通过if.

var mySet = new SortedSet<string>();

while(dbReader.Read())
{
  if(dbReader["GenSubject"] != DBNull.Value)
  {
    var generalSubject = (string)dbReader["GenSubject"];
    if(!generalSublject.Equals("No related topics"))
    {
      mySet.Add(generalSubject); // returns false if already in Set
    }
    else
    {
      // do nothing
    }
}

这对您有帮助并回答您的问题吗?我希望我做对了,并帮助你编写了一个只关注问题的简化版本的代码。但它有一些含义:

  • 一个ISet典型的实现是SortedSet(基于树的)和HashSet(基于散列的)——不保证元素的特定顺序,但它确实保证它们是唯一的
  • 您可以Contains使用ISet(或多或少)对数而不是线性的努力(可能会显着加快您的程序,具体取决于元素的数量)。
  • 如果合适,您也可以使用 SQLDISTINCT来使元素独一无二。但是,这需要您重构查询。
于 2013-02-08T10:50:56.810 回答