防止将重复项添加到checkedlistbox中

时间:2014-08-15 08:04:21

标签: c# winforms checkedlistbox

我已经编写了一个代码,用于向checkedlistbox添加一个列表,如果列表中有相同的项目,我想检查checkedlistbox。我的代码根本没有向checkedlistBox添加任何项目。任何人都可以建议问题是什么?。

 int y;

           if (clb_output.Items.Count != 0){
           for (y = 0; y < q.Count; y++){
               for (int z = 0; z < clb_output.Items.Count; z++)
               {
                   if (q[y].ToString() != clb_output.Items[z].ToString())
                   {
                       clb_output.Items.Add(q[y].ToString());
                       break;
                   }
                   else { }

               }
           }
           }
           else
           {
               for (int t = 0; t < q.Count;t++ )
                   clb_output.Items.Add(q[t].ToString()); 

           }

3 个答案:

答案 0 :(得分:0)

如果clb_output.Items.Count()在你的第二个for循环中为零,那么你将永远不会到达添加到该框的语句。您需要在代码开头设置断点,以查看发生的情况并修复逻辑。

        int y;

        if (clb_output.Items.Count != 0)
        {
            for (y = 0; y < q.Count; y++)
            {
                if (!clb_output.Items.Contains(q[y].ToString()))
                {
                    clb_output.Items.Add(q[y].ToString());
                }
            }
        }
        else
        {
            for (int t = 0; t < q.Count; t++)
                clb_output.Items.Add(q[t].ToString());

        }

答案 1 :(得分:0)

1)请确保你的q集合不是空的

2)我通常填写这样的列表:

for (int y = 0; y < q.Count; y++)
{
    if(!clb_output.Indexof(q[y].ToString.Trim.ToLower() > -1)
    {
             clb_output.Items.Add(q[y].ToString());
    }
}

答案 2 :(得分:0)

面对这些问题时,测试驱动开发是解决问题的好方法。

首先设置要测试的类和测试(我们暂时忽略模拟和东西)

public class MyClass {
  private readonly List<Item> q = new List<Item>();
  private readonly List<Item> checkedItems = new List<Item>();

  public ICollection<Item> Q
  {
     get { return q; }
  }

  public ICollection<Item> CheckedItems
  {
     get { return checkedItems; }
  }

  public void TransferItems() {
    // todo:
  }
}

public class Item { }

您可以使用Visual Studio单元测试添加测试方法,或使用类似NUnit的方法。

[TestFixture]
public class MyClassTest {
  [Test]
  public void NewItemsAreAddedWhenCheckedItemsIsEmpty() {
    // arrange
    Item expectedItem = new Item();
    MyClass tester = new MyClass();
    tester.Q.Add(expectedItem);

    // act
    tester.TransferItems();

    // assert
    int actualCount = tester.CheckedItems.Count;
    int expectedCount = 1;

    Assert.Equals(actualCount, expectedCount);

    var actualItem = tester.CheckedItems[0];
    Assert.AreSame(actualItem, expectedItem);
  }

  [Test]
  public void NewItemsAreAddedWhenCheckedItemsContainsElements() {
    // arrange
    Item expectedItem = new Item();
    MyClass tester = new MyClass();
    tester.Q.Add(expectedItem);
    tester.CheckedItems.Add(new Item());

    // act
    tester.TransferItems();

    // assert
    int actualCount = tester.CheckedItems.Count;
    int expectedCount = 2;

    Assert.Equals(actualCount, expectedCount);

    var expectedContains = tester.CheckedItems.Contains(expectedItem);
    Assert.IsTrue(expectedContains);
  }
}

如果这样,您只需运行测试,看到它失败并相应地更改您的代码。

public class MyClass {
  private readonly List<Item> q = new List<Item>();
  private readonly List<Item> checkedItems = new List<Item>();

  public ICollection<Item> Q
  {
     get { return q; }
  }

  public ICollection<Item> CheckedItems
  {
     get { return checkedItems; }
  }

  public void TransferItems() {
    IEnumerable<Item> itemsToAdd = q.Where(item => !checkedItems.Contains(item));
    checkedItems.AddRange(itemsToAdd);
  }
}