c# - 对 ObservableCollection<T> 中的数据进行分组

标签 c# observablecollection

我正在尝试按数据创建日期(月份和年份)对数据进行分组。如果特定组已存在,如何迭代 ObservableCollection of Groups,如果存在,则将数据添加到具有相同月年 ID 的组中?如果包含日期的组不存在,程序应创建一个组并将数据添加为第一项。我有两个数据模型类 - 数据和组:

public class Data
{
    public string Name { get; set; }
    public double Amount { get; set; }
    public static DateTimeOffset Date { get; set; }

    private string ID = Date.ToString("MM/yyyy");
}

public class Group
{        
    public ObservableCollection<Data> DataGroup { get; set; }
    private string ID;

    public Group(string id)
    {
        ID = id;
    }
}

这是我想象的 AddData 方法的工作方式:

public async Task AddData(Data data)
    {
        var id = data.ID;
        Group newGroup = new Group(id);
        foreach (Group group in _groups)
        {
            if (/*what kind of condition should i put here?*/)
            {
                if (group.ID == id)
                {
                    newGroup.DataGroup.Add(data);
                }
            }
            else
            {
                _groups.Add(newGroup);
                newGroup.DataGroup.Add(data);
            }
        }            
        await saveDataAsync();               
    }

现在,有没有办法检查 _groups 集合是否有等于 newGroup(相同 ID)的项目?

最佳答案

一种可能的解决方案是通过 FirstOrDefault 获取现有组。如果不存在,请创建一个并将其添加到 _groups 集合中。无论哪种方式,此后您都将获得该组的相关引用,并且只需添加数据即可。

示例:

public async Task AddData(Data data)
{
    var id = data.ID;

    //Will return null if no such group exists
    Group relevantGroup = _groups.FirstOrDefault(f => f != null && f.ID == id);
    if(relevantGroup == null)
    {
        //Didn't have one so we add the a new group and assign it to the variable
        relevantGroup = new Group(id);
        _groups.Add(relevantGroup);
    }
    //This now always references the correct group, just add your data item
    relevantGroup.Add(data);

    await saveDataAsync();               
}

编辑:添加了null引用检查。

关于c# - 对 ObservableCollection<T> 中的数据进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30528301/

相关文章:

c# - 将 ObservableCollection 转换为列表?

c# - 为可观察集合实现中介设计模式

c# - mvc 3 嵌套对象绑定(bind)

c# - Linq 不同计数

c# - 断言比较两个对象列表 C#

wpf - MVVM:双向绑定(bind)到模型中的数组(没有 INotifyPropertyChanged)

wpf - 可观察的集合可以作为ref参数传递吗?

c# - 如何在获得焦点时禁用 UI.InputField 的 SelectAll() 文本?

c# - Encryption Salt Algo CryptSharp 提供了不同的密码加密.....如何使用它

c# - 组合框项目源 = ObservableCollection & 我需要在顶部有一个 '-None-' 虚拟条目