在 ObservableCollection<T> 中分组数据

grouping data in ObservableCollection<T>

我正在尝试按创建日期(月和年)对数据进行分组。如果特定组已经存在,我如何遍历组的 ObservableCollection,如果存在,则将数据添加到具有相同月年 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 获取现有组。如果 none 存在,则创建一个并将其添加到 _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 参考检查。

上面的@frankJ 使用 lambda 表达式用一个非常好的和干净的方法回答了我的问题,尽管它的 FirstOrDefault 方法不接受空引用。我想到了这样的事情:

public async Task AddData(Data data)
    {
        var id = data.ID;
        Group newGroup = new Group(id);
        bool checkIfExists = false;

        foreach (Group group in _groups)
        {
            if (group.ID == newGroup.ID)
            {
                checkIfExists = true;
                break;
            }               
        }

        if (checkIfExists)
        {
            foreach (Group group in _groups)
            {
                if (group.ID == id)
                {
                    group.DataGroup.Add(data);
                }
            }       
        }
        else
        {
            newGroup.DataGroup.Add(data);
            _groups.Add(newGroup);
        }

        await saveDataAsync();               
    }