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