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