我在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或过滤我的通用字段列表来实现此目的?我可以利用列表中可用的“选择”或“在哪里”方法吗?
答案 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();