Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从IEnumerable对象向ComboBox添加项_C#_Combobox - Fatal编程技术网

C# 从IEnumerable对象向ComboBox添加项

C# 从IEnumerable对象向ComboBox添加项,c#,combobox,C#,Combobox,我有一个System.Timers.Timer,它每5秒钟更新一次我的win form应用程序组件 我有一个组合框和全局IEnumerable列表,每5秒钟更新一次。 我需要在组合框中添加人名。如果该名称已在列表中,我不应添加 我怎样才能继续? 下面是计时器事件中的代码。这会增加多次,我不确定使用foreach时是否会这样做,也许IEnumerable接口有一种更简单的方法 foreach (Persons person in personsList) { comboBox.Items.Ad

我有一个
System.Timers.Timer
,它每5秒钟更新一次我的win form应用程序组件

我有一个组合框和全局
IEnumerable
列表,每5秒钟更新一次。 我需要在组合框中添加人名。如果该名称已在列表中,我不应添加

我怎样才能继续? 下面是计时器事件中的代码。这会增加多次,我不确定使用
foreach时是否会这样做,
也许
IEnumerable
接口有一种更简单的方法

foreach (Persons person in personsList)
{
  comboBox.Items.Add(person.Name);
}

假设您使用的是.NET 3.5或更高版本,这是解决此问题的更简单的解决方案之一:

foreach(Person person in personsList)
{
    if(!comboBox.Items.Cast<string>().Contains(person.Name)) 
    {
        comboBox.Items.Add(person.Name);
    }
}

两种方法可以是遍历组合框中的所有项目,或者跟踪已添加的名称列表。你有什么性能要求吗

更简单的方法是直接绑定到人员列表并适当设置DisplayMember…

如果可能,使用通常是好的。WPF甚至有更好的绑定,允许使用。WPF实际上会在您修改原始集合时进行修改(实时),而不必每次都读取所有内容

每次通过时阅读所有项目是一种不好的方法,但这是一种简单的解决方法。如果代码允许,最好直接修改列表框(不要太多更新,也不要太耗时),或者复制列表并只执行差异。(第1步:删除combobox中新列表中不存在的任何项目。第2步:添加combobox中不存在的新列表中的任何项目)

如果我绑定数据cmb.DataSource=personsList;cmb.DisplayMember=“主题”;这行不通

这对我也不起作用。在尝试找到此解决方案后,也许它会帮助某些人:

   IEnumerable<ICustomer> customers = GetCustomers(); //fill Ienumerable object list
   _comboBox.DataSource = customers.ToList(); //convert it to list and it binds fine
   _comboBox.DisplayMember = "Name";          // field Name from ICustomer
   _comboBox.ValueMember = "CustomerID";      // field CustomerID from ICustomer
IEnumerable customers=GetCustomers()//填充Ienumerable对象列表
_comboBox.DataSource=customers.ToList()//将它转换为列表,它将很好地绑定
_comboBox.DisplayMember=“Name”//来自ICustomer的字段名
_comboBox.ValueMember=“CustomerID”//来自ICustomer的字段CustomerID

更简单的方法是:

comboBox.Items.Clear();
comboBox.Items.AddRange(personsList.Select(p => p.Name));
只需清除组合框并再次添加整个列表。或者,如果您不喜欢清除组合框:

comboBox.Items.AddRange(personsList.Where(p => !comboBox.Items.Cast<string>().Contains(p.Name)).Select(p => p.Name));   
comboBox.Items.AddRange(personsList.Where(p=>!comboBox.Items.Cast().Contains(p.Name))。选择(p=>p.Name));

您不再需要foreach的
foreach
。简单地用这个替换所有代码

如果我绑定数据cmb.DataSource=personsList,您可能需要对数据绑定进行一些研究;cmb.DisplayMember=“主题”;这行不通为什么不清除项,然后添加IEnumerable?我必须添加
.ToArray()
,因为它说“无法从'System.Collections.Generic.IEnumerable'转换为'object[]”
comboBox.Items.AddRange(personsList.Where(p => !comboBox.Items.Cast<string>().Contains(p.Name)).Select(p => p.Name));