我找到了解决问题的方法,但我想知道是否有人可以解释为什么会这样。
我有一个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;
}
}
在我的代码中,我有一个DataCollector的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));
为什么我要这个?将“dc”添加到“dataCollector”是否会创建指向“dataGrid”的链接?如果它确实没有意义。
答案 0 :(得分:1)
您这样做是因为dataCollector.Add(dc)
复制了对象内存位置的引用。因此,对位置数据的更改将反映在任一集合中,因为它们保存指向相同对象的指针。
你可以做的是模仿复制构造函数。
public DataCollector(DataCollector dataCollector)
{
Name = dataCollector.Name;
Group = dc.Group;
//...
}
保持代码清洁。