C# 如何使用LINQ在集合中选择集合?
我有以下结构C# 如何使用LINQ在集合中选择集合?,c#,linq,binding,C#,Linq,Binding,我有以下结构 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 c
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; }
编辑:
谢谢你所有的好(快)答案。事实证明,我只需要第一项,但我知道SelectMany方法将在未来派上用场。所以,谢谢你的提醒。这是我使用的完整解决方案
myListBox.ItemsSource = (from i in settings
where i.Extension == myExtension
select i.Tools).First();
或者,如果您更喜欢查询语法而不是流利语法:
myListBox.ItemsSource = from s in settings
where (s.Extension == myExtension)
from t in s.Tools
select t;
您可以使用
.SelectMany()
,但这只有在您希望使用多个工具设置并将其所有工具作为单个集合选择时才真正有用。如果扩展是唯一的,请使用.Single()
将单个集合的集合简化为单个集合。问题有点模糊。您是对的,您得到的是一个集合的集合,因为可能只有一个ToolSettings
实例Extension
满足您的条件,因此,由于您选择了Tools
,因此您得到的是一系列observetecollection
实例
听起来您真正想要的是获得满足条件的所有Tool
实例的序列。在这种情况下,您希望使用:
或者,如果您喜欢查询语法,可以执行以下操作:
myListBox.ItemsSource =
from i in settings
where i.Extension == myExtension
from t in i.Tools
select t;
编译器完成后,它将转换为调用SelectMany。这将为您提供一个
IEnumerable
。它可能只有一个项目,但该项目将是一个可观察的集合。如果您想要该集合本身,请在末尾添加.First()
(或.FirstOrDefault()
)
如果i.Extension==myExtension
可以在集合中找到多个工具设置(我猜不是),那么您需要使用。SelectMany()
尝试以下方法:
myListBox.ItemsSource = (from i in settings
where i.Extension == myExtension
from t in i.Tools
select t);
你需要改变方法调用的顺序。SelectMany应该改名为更直观的名称,它是linq最有用的部分之一,很多人很难找到它,有人问如何做到这一点,比如一天5次。。也许像SelectFlatte或SelectRecursive那样,人们可以更快地将其从intellisense中拉出。。
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;
myListBox.ItemsSource = (from i in settings
where i.Extension == myExtension
from t in i.Tools
select t);