1

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

我有一个类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”的链接?如果是这样,那就没有意义了。

4

1 回答 1

1

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

public DataCollector(DataCollector dataCollector)
{
  Name = dataCollector.Name;
  Group = dc.Group;
 //...
}

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

于 2012-10-17T21:29:48.010 回答