如何使用LINQ在集合中选择集合?

时间:2010-08-17 14:27:52

标签: 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 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();

5 个答案:

答案 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的调用。