【发布时间】:2017-08-26 05:43:20
【问题描述】:
底线是我想要一个 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 { 公共 int ID { 获取;私人套装; } 公共字符串值 { 获取;私人套装; } 公共字典元数据 { 获取;私人套装; }
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,最后它应该包含任何VarItems,其中ID匹配任何PdioChannelModel.Number,其中PdioChannelModel.Mode.Value != "Q-Decode" or "Quad Index"
如果我错过了任何需要的细节,请告诉我。如果我让您感到困惑并写了很多或需要澄清,请告诉我。
【问题讨论】:
-
您是否尝试用一个 linq 或 jsut foreach 位替换所有代码,因为虽然您可以将其写为一个命令,但实际上它实际上是在做三种不同的事情(默认,当前, 过滤) 可能意味着将这些内容分开更易读。 foreach 可能很容易更改为
filtered.AddRange和 Where 后跟 Select 如果这就是您想要的,但我再次倾向于“如果它没有损坏,请不要修复它”。当然,作为下一次的学习练习,它仍然有用...... :) -
一些问题。
channels来自哪里?和indexChannels是同一类型吗?IndexChannels(大写 I)是错字吗?是否保证indexChannels.First()始终是“禁用”项?我认为这可以通过过滤和排序来实现。