c# - 列表中的 LINQ 查询列表

标签 c# linq

我有以下 EF 对象列表,Leagues,其中每个对象都有一个 Teams 列表。每个 Team 都有与之关联的年份

在 WPF 表单中,我有一个 combobox 供多年选择。当我选择一年时,我希望能够按当年存在的联赛排序,然后是它拥有的球队,这样我就可以为其填充 TreeView

到目前为止我最多的是:

    public int SelectedYear
    {
        get => _SelectedYear;
        set
        {
            _SelectedYear = value;
            RaisePropertyChangedEvent("SelectedYear");
            Refresh();
        }
    }

    public void Refresh(object sender = null, EventArgs e = null)
    {
        Leagues = new ObservableCollection<League>(_Locator.Statistix.Leagues.Where(x => x.Teams.Count(t => t.Year == SelectedYear) > 0).ToList());
        foreach(League l in Leagues)
        {
            l.Teams.Where(x => x.Year == SelectedYear);
        }
    }

League对象如下:

public partial class League
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public League()
    {
        this.Teams = new HashSet<Team>();
    }

    public int ID { get; set; }
    public string Name { get; set; }
    public string Initials { get; set; }
    public string LahmanID { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Team> Teams { get; set; }
}

为了更好的衡量,这里还有 Team 对象:

public partial class Team
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Team()
    {
        this.Games = new HashSet<Game>();
        this.Games1 = new HashSet<Game>();
    }

    public int ID { get; set; }
    public int FranchiseID { get; set; }
    public int Year { get; set; }
    public Nullable<int> CityID { get; set; }
    public string Nickname { get; set; }
    public Nullable<int> BallparkID { get; set; }
    public int LeagueID { get; set; }

    public virtual City City { get; set; }
    public virtual Franchise Franchise { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Game> Games { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Game> Games1 { get; set; }
    public virtual League League { get; set; }
}

有没有一种方法可以过滤同一个 Leagues ObservableCollection 中球队所关注的联赛?

最佳答案

如果联盟的规模不是太大,我会考虑收集数据,然后提取不需要的数据。

public void Refresh(object sender = null, EventArgs e = null)
    {
        Leagues = new ObservableCollection<League>(_Locator.Statistix.Leagues.ToList());
        foreach(League l in Leagues)
        {
            l.Teams.RemoveAll(x => x.Year == SelectedYear);
        }
        Leagues.RemoveAll(x => x.Teams.Count == 0);
    }

另一种方法是构建 ObserableCollection 固有的专用类并实现 IObseravable 以构建专用逻辑以将类用作 WPF 表单的数据上下文,这将允许系统在选择不同年份时自动过滤.

关于c# - 列表中的 LINQ 查询列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52463261/

相关文章:

c# - LINQ lambda 表达式替换字符串中的多个字符?

c# - NULL 数组上的笛卡尔

c# - 无法使用 Lambda 的扩展方法访问实例变量

c# - 我的数据库系统找不到 asp.net 中指定的文件

c# - 链接具有不同返回类型的任务

c# - URL 重写不起作用

c# - Microsoft Bot Framework - 如何将数据从 Azure 数据库获取到我的 Bot 项目?

c# - 无论顺序如何,获取字符串列表的哈希值

c# - 需要将一个类转换为另一个具有不同值集合的类

c# - 如何使用 LINQ 仅返回列的第一个字符在某个范围内的行?