Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ObservableCollection中分组数据<;T>;_C#_Observablecollection - Fatal编程技术网

C# 在ObservableCollection中分组数据<;T>;

C# 在ObservableCollection中分组数据<;T>;,c#,observablecollection,C#,Observablecollection,我正在尝试按创建日期(月份和年份)对数据进行分组。如果特定的组已经存在,我如何遍历ObservaleCollection组,如果已经存在,则使用相同的月-年ID将数据添加到组中?如果带有日期的组不存在,程序应创建一个组并将数据作为第一项添加。我有两个数据模型类-数据和组: public class Data { public string Name { get; set; } public double Amount { get; set; } public static

我正在尝试按创建日期(月份和年份)对数据进行分组。如果特定的组已经存在,我如何遍历ObservaleCollection组,如果已经存在,则使用相同的月-年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;
    }
}

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

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

例如:

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
reference检查。

over@frankJ使用lambda表达式用一个非常好且干净的方法回答了我的问题,尽管它的FirstOrDefault方法不接受null引用。我想出了这样的办法:

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

newGroup==group
并实现
=
-opterator。或者改用
.Equals
来代替。强烈建议不要使用
异步void
(事件处理程序除外),改用
异步任务
。@PatrikEckebrecht这不就是在每次迭代中将newGroup添加到集合中,直到它到达相等的组为止吗?我需要一个条件来判断该组是否存在,(最好在迭代开始之前)如果它等于当前迭代中的组,则不接受。实际上,这给了我“value cannot be null”异常。FirstOrDefault似乎不接受null引用。行
if(group.ID==newGroup.ID)
在您的代码中只会抛出相同的
NullReferenceException
您只需检查我的解决方案中的
null
值,例如
…\u groups.FirstOrDefault(f=>f!=null&&f.ID==ID)
事实上它没有。在本例中,似乎唯一不接受空引用的方法是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();               
    }