2009-01-24 83 views
3

对象我有下面的类在我的C#.NET 3.5双赢的形式应用:过滤列表从另一个列表中

class Field { 

string objectName; 
string objectType; 
string fieldName; 
string fieldValue; 


} 

和列表fieldList中是一个checkedlistbox数据源。这个列表框显示了我的fieldList集合中的所有不同的objectNames。

我想创建另一个包含fieldNames的checkedlistbox,但只显示在第一个列表框中具有关联的checked objectName的字段名。

所以我的问题是如何查询objectName的原始列表的DataSource返回与选定的objectName关联的不同的fieldNames集?

不是很容易阅读,所以我会举一个例子:

Field1 { 

objectName = 'objA' 
FieldName = 'FieldA' 

} 

Field2 { 

objectName = 'objA' 
FieldName = 'FieldB' 

} 


Field3 { 

objectName = 'objB' 
FieldName = 'FieldA' 

} 

Field4 { 

objectName = 'objC' 
FieldName = 'FieldC' 

} 

在我的复选框,因此,假设我选择对象名排序objA和objB。然后我返回的字段将是'FieldA'和'FieldB'。

我该如何使用LINQ或过滤我的通用字段列表来实现这一目标?我可以使用列表中可用的'select'或'where'方法吗?

回答

1
var selectedNames = ... // List of selected names 
var selectedFields = (from f in fieldList 
         where selectedNames.Contains(f.objectName) 
         select f.FieldName).Distinct().ToList(); 
2

首先将对象名读入数组或列表中;我会伪造那部分。那么就应该是这样的:

string[] objectNames = { "objA", "objC" }; 
    var hashSet = new HashSet<string>(objectNames); 

    var qry = (from row in data 
       where hashSet.Contains(row.objectName) 
       select row.fieldName).Distinct().ToList(); 

(编辑)

要获得所选择的名称(位我伪造的),你可以尝试(未经测试):

var selectedNames = namesCheckedListBox.CheckedItems.Cast<Field>() 
     .Select(field => field.objectName); 
    var hashSet = new HashSet<string>(selectedNames); 

(注意没有必要在上面使用Distinct(),因为HashSet<T>不管怎么说)