我如何使用 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# 中的项:
- Returns 如果没有选择,则所有项目
或
- Returns 如果至少选择了一项,则只选择项目。
MyClassSelectable
有一个 属性 名为 Selected
的 bool
类型。
是否可以只在一个 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)
在以下情况下,我正在尝试使用 Linq 和 Lambda 在 ObservableCollection<MyClassSelectable>
中获取 C# 中的项:
- Returns 如果没有选择,则所有项目
或
- Returns 如果至少选择了一项,则只选择项目。
MyClassSelectable
有一个 属性 名为 Selected
的 bool
类型。
是否可以只在一个 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)