底线是我想要一个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()'总是“禁用”项目?我认为这可以通过筛选和排序来实现。 –