繁体   English   中英

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

[英]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 个组,这会将具有所选项目的组放在首位。 然后,返回第一组。

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 个项目,则返回两个项目的列表。
  • 如果未选择任何项目,则返回所有 4 个项目。

非常感谢您的工作@GregaMohorko。

return new ObservableCollection<MyClassSelectable>(myCol.Any(x => x.Selected)?myCol
.Where(x => x.Selected):myCol)

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

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;
    }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM