底線是我想要一個linq語句返回與下面的代碼相同的列表。從列表中篩選列表
我覺得這是可能的,我覺得我非常接近,然後才放棄,只是用更多的代碼說明了我想要的東西。
雖然我會喜歡和欣賞任何能證明我期待未來實現的東西,並取代我擁有的東西。
public ObservableCollection<VarItem> IndexChannels
{
get
{
ObservableCollection<VarItem> filtered = new ObservableCollection<VarItem>();
filtered.Add(indexChannels.First());//add Disabled no matter what
//add the cur channels selected index if it isn't already disabled
if (!filtered.Contains(indexChannels.FirstOrDefault(i => i == CurChannel.IndexChannel)))
{
filtered.Add(indexChannels.FirstOrDefault(i => i == CurChannel.IndexChannel));
}
foreach (PdioChannelModel ch in channels)
{
//if the channels mode isn't q-decode or quad index add its Number as an index
if (ch.Mode.Value != "Q-Decode" && ch.Mode.Value != "Quad Index")
{
filtered.Add(indexChannels.FirstOrDefault(i => i.ID == ch.Number));
}
}
return filtered;
}
}
VarItem
的基本結構公共類VarItem { 公衆詮釋ID {獲得;私人設置; } public string Value {get;私人設置; } public Dictionary MetaData {get;私人設置; }
public VarItem(int id, string value)
{
this.ID = id;
this.Value = value;
MetaData = new Dictionary<string, string>();
}
例如主列表包含VarItems:
-1, 「禁用」
1, 「通道1」
2中, 「通道2」
3, 「頻道3」
過濾列表應始終包含VarItem(-1, Disabled)
。它也應該包含VarItem
其中ID
比賽CurChannel.IndexChannel
,最後它含有前人的精力任何VarItem
S其中的ID匹配任何PdioChannelModel.Number
其中PdioChannelModel.Mode.Value != "Q-Decode" or "Quad Index"
如果我錯過了所需要的任何細節讓我知道。如果我讓你感到困惑,寫信給你或者需要澄清,請讓我知道。
你們是不是因爲,作爲一個命令實際上它有效地做,而你很可能寫LINQ的單位,以取代所有的代碼或僅僅指剛在foreach位三種不同的東西(默認,當前,過濾)可能意味着將這些東西分開的可讀性更高。該foreach可能很容易更改爲'filtered.AddRange'和Where後跟Select,如果這就是你想要的,但我會傾向於「如果它沒有壞,不修復它」。雖然當然作爲一個學習練習下次它仍然有用... :) – Chris
一些問題。 '渠道'從哪裏來?它是否與'indexChannels'類型相同? 「IndexChannels」(首字母I)是否是一個錯字?並保證'indexChannels.First()'總是「禁用」項目?我認爲這可以通過篩選和排序來實現。 –