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