过滤另一个列表中的列表对象

时间:2009-01-24 08:01:38

标签: c# generics checkedlistbox

我在C#.NET 3.5 win窗体应用程序中有以下类:

class Field {

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


}

和List fieldList,它是checkedlistbox的数据源。此列表框显示我的fieldList集合中的所有不同objectNames。

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

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

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

Field1 {

objectName = 'objA'
FieldName = 'FieldA'

}

Field2 {

objectName = 'objA'
FieldName = 'FieldB'

}


Field3 {

objectName = 'objB'
FieldName = 'FieldA'

}

Field4 {

objectName = 'objC'
FieldName = 'FieldC'

}

因此,在我的复选框中,我选择objectNames objA和objB。然后我返回的字段将是'FieldA'和'FieldB'。

如何使用LINQ或过滤我的通用字段列表来实现此目的?我可以利用列表中可用的“选择”或“在哪里”方法吗?

2 个答案:

答案 0 :(得分: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>无论如何都会这样做)

答案 1 :(得分:1)

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