列表<T>在<T> <T> 更改列表索引项时修改可观察集合



我已经找到了解决问题的方法,但我想知道是否有人能解释为什么会发生这种情况。

我有一个类DataCollector。

public class DataCollector
{
public string Name { get; set; }
public string Group { get; set; }
public int Count { get; set; }
public Brush Color { get; private set; }
public DataCollector(string name, string group, int count, Brush color)
{
Name = name;
Group = group;
Count = count;
Color = color;
}
}

在我的代码中,我有一个数据收集器的ObservableCollection。

public ObservableCollection<DataCollector> dataGrid { get; set; }

我收集我的数据,并使用它,直到我去添加更多的功能到代码。

我想浏览"dataGrid",列出组,并从所有名称中获得总数。

List<DataCollector> dataCollector = new List<DataCollector>();
List<string> _groupNames = new List<string>();
foreach (DataCollector dc in dataGrid)
{
int cnt = 0, index = 0;
bool groupFound = false;
if (dataCollector.Count == 0)
{
_groupNames.Add(dc.Group);
dataCollector.Add(dc));
}
else
{
foreach (string groupNames in _groupNames)
{
if (groupNames == dc.Group)
{
index = cnt;
nameFound = true;
}
cnt++;
}
if (nameFound)
{
// When I do this my dataGrid.Count increments, too
dataCollector[index].Count += dc.Count;
}
else
{
_groupNames.Add(dc.Group);
dataCollector.Add(dc);
}
}
}

为了解决这个问题,我改变了

dataCollector.Add(dc);

dataCollector.Add(new DataCollector(dc.Name, dc.Group, dc.Count, dc.Color));

为什么我必须这么做?在"dataCollector"中添加"dc"是否会创建到"dataGrid"的链接?如果真的发生了,那就没有意义了。

这样做是因为dataCollector.Add(dc)将引用复制到对象的内存位置。因此,对该位置数据的更改会反映在任一集合中,因为它们持有指向相同对象的指针。相反,您可以模仿复制构造函数。
public DataCollector(DataCollector dataCollector)
{
Name = dataCollector.Name;
Group = dc.Group;
//...
}

它可以让你的代码保持干净。

最新更新