我有以下结构。
public class ToolSettings
{
public string Extension { get; set; }
public ObservableCollection<Tool> Tools { get; set; }
}
public class Tool
{
public string Name { get; set; }
public string Command { get set; }
}
// Within app code
public ObservableCollection<ToolSettings> settings { get; set; }
我想从设置集合中获取Tools集合,其中Extension等于某个字符串。
下面是我的LINQ代码,但是当我知道还有更多时,我只收集了我的收藏中的一个项目。看起来它产生了一个集合的集合,这就是为什么只有一个项目。
myListBox.ItemsSource = from i in settings
where i.Extension == myExtension
select i.Tools;
编辑:
感谢所有好的(和快速的)答案。事实证明我只需要第一个项目,但我知道SelectMany方法将来会派上用场。所以,感谢所有的提醒。这是我使用的完整解决方案。
myListBox.ItemsSource = (from i in settings
where i.Extension == myExtension
select i.Tools).First();
答案 0 :(得分:9)
myListBox.ItemsSource = settings.Where(s => s.Extension == myExtension)
.SelectMany(s => s.Tools);
或者,如果您更喜欢使用流利语法的查询语法:
myListBox.ItemsSource = from s in settings
where (s.Extension == myExtension)
from t in s.Tools
select t;
答案 1 :(得分:2)
这会给你一个IEnumerable<ObservableCollection<Tool>>
。它可能只有一个项目,但该项目将是一个ObservableCollection。如果您想要该集合本身,请在最后添加.First()
(或.FirstOrDefault()
)。
如果i.Extension == myExtension
可以在集合中找到多个ToolsSettings(我猜不是),那么您需要使用.SelectMany()
答案 2 :(得分:1)
试试这个:
myListBox.ItemsSource = (from i in settings
where i.Extension == myExtension
from t in i.Tools
select t);
答案 3 :(得分:0)
您可以使用.SelectMany()
,但如果您想要使用多个工具设置并选择所有工具作为单个集合,那么这只是非常有用。如果Extension是唯一的,请使用.Single()
将单个集合的集合减少到单个集合。
答案 4 :(得分:0)
问题有点模糊。你是对的,你得到的是一个集合的集合,因为可能只有一个ToolSettings
个实例,其中Extension
符合你的标准,因此你选择了Tools
,你得到一系列ObservableCollection<Tool>
个实例。
你真正想要的是获得符合条件的所有Tool
个实例的序列。在这种情况下,您想使用SelectMany extension method on the Enumerable class:
myListBox.ItemsSource = settings.Where(i => i.Extension == myExtension).
SelectMany(i => i.Tools);
或者,如果您更喜欢查询语法,则可以执行以下操作:
myListBox.ItemsSource =
from i in settings
where i.Extension == myExtension
from t in i.Tools
select t;
当编译器完成后,将转换为对SelectMany的调用。