在ObservableCollection <t>中对数据进行分组

时间:2015-05-29 11:21:48

标签: c# observablecollection

我尝试按创建日期(月份和年份)对数据进行分组。如果特定组已经存在,如何迭代组的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)?

2 个答案:

答案 0 :(得分:3)

一种可能的解决方案是通过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参考检查。

答案 1 :(得分:0)

以上@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();               
    }