我如何使用 C# Linq 在 ObsevableCollection<T> 中 return,如果没有选择任何项目,或者如果至少选择一个项目,则只选择项目?

How can I return in a ObsevableCollection<T> using C# Linq, all items if no one is selected or just selected items if at least one is selected?

在以下情况下,我正在尝试使用 Linq 和 Lambda 在 ObservableCollection<MyClassSelectable> 中获取 C# 中的项:

MyClassSelectable 有一个 属性 名为 Selectedbool 类型。

是否可以只在一个 Linq 查询行中做到这一点?

谢谢。

您可以先按 Selected 属性 分组。如果有选中和未选中的项目,这将为您提供 2 个组;如果所有项目都被选中或未选中,则为 1 个组。然后,按所选 属性 对组进行排序。如果有 2 个组,这会将带有选定项目的组放在首位。然后,return第一组。

ObservableCollection<MyClassSelectable> myClassesSelectable;

List<MyClassSelectable> result = myClassesSelectable
    // group by the Selected property
    .GroupBy(mcs => mcs.Selected)
    // order (=> true first, false second)
    .OrderByDescending(g => g.Key)
    // return the first
    .FirstOrDefault()
    ?.ToList();

为了回答@Pavel Anikhouski 和更新@GregaMohorko 的回答,下面的代码正确地完成了工作。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;

namespace Test
{
    public class MyClassSelectable
    {
        public bool Selected { get; set; }
        public string Name { get; set; } = "";
    }

    public class Class1
    {

        public ObservableCollection<MyClassSelectable> myClassesSelectable = new ObservableCollection<MyClassSelectable>();

        public Class1()
        {
            myClassesSelectable.Add(new MyClassSelectable { Selected = true, Name = "Item 1" });
            myClassesSelectable.Add(new MyClassSelectable { Selected = true, Name = "Item 2" });
            myClassesSelectable.Add(new MyClassSelectable { Selected = false, Name = "Item 3" });
            myClassesSelectable.Add(new MyClassSelectable { Selected = false, Name = "Item 4" });

            IEnumerable<MyClassSelectable> myCollection = myClassesSelectable
                            // group by the Selected property
                            .GroupBy(mcs => mcs.Selected)
                            // order (=> true first, false second)
                            .OrderByDescending(g => g.Key)
                            // return the first OR an empty collection if there are no items
                            .FirstOrDefault()
                            ?.ToList();
        }

    }
}
  • 如果选择了 2 个项目,它 returns 两个项目的列表。
  • 如果没有选择任何项目,returns 所有 4 个项目。

非常感谢@GregaMohorko 的工作。

您也可以在不使用 Group By() 的情况下实现相同的行为。

class MainClass {
  public static void Main (string[] args) {
    var myCollection = new ObservableCollection<MyClassSelectable>();

    // Add some items of tyoe MyClassSelectable to myCollection here
    myCollection.Add(new MyClassSelectable() { Selected = true });
    myCollection.Add(new MyClassSelectable() { Selected = false });
    myCollection.Add(new MyClassSelectable() { Selected = true });
    myCollection.Add(new MyClassSelectable() { Selected = true });


    // Now get selected or all items
    var selected = GetSelectedItems(myCollection);

    Console.WriteLine($"Items selected: {selected.Count()}");
  }

  private static IEnumerable<MyClassSelectable> GetSelectedItems(ObservableCollection<MyClassSelectable> coll) {
    var selected = coll.Where(c => c.Selected);
    if (selected.Count() > 0) {
      return selected;
    }
    else {
      return coll;
    }
  }
}
return new ObservableCollection<MyClassSelectable>(myCol.Any(x => x.Selected)?myCol
.Where(x => x.Selected):myCol)