2009-01-24 86 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>不管怎麼說)