Как я могу вернуть в ObsevableCollection <T>, используя C# Linq, все элементы, если никто не выбран, или только выбранные элементы, если хотя бы один выбран? - PullRequest
1 голос
/ 20 февраля 2020

Я пытаюсь получить элементы в C# в ObservableCollection<MyClassSelectable>, используя Linq и Lambda в следующих случаях:

  • Возвращает все элементы, если никто не выбран

Или

  • Возвращает только выбранные элементы, если выбран хотя бы один.

MyClassSelectable имеет свойство с именем Selected типа bool.

Возможно ли это сделать только в одной строке запроса Linq?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 20 февраля 2020

Вы можете сначала сгруппировать по свойству 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();
1 голос
/ 20 февраля 2020

Чтобы ответить @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.

0 голосов
/ 20 февраля 2020
return new ObservableCollection<MyClassSelectable>(myCol.Any(x => x.Selected)?myCol
.Where(x => x.Selected):myCol)
0 голосов
/ 20 февраля 2020

Вы также можете достичь того же поведения без использования 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;
    }
  }
}
...