[英]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
有一个名为Selected
的bool
类型属性。
是否可以仅在一个 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();
}
}
}
非常感谢您的工作@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.