列表<t>在List <t>索引项目更改时修改ObservableCollection <t> </t> </t> </t>

时间:2012-10-17 21:25:44

标签: list observablecollection

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

我有一个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”的链接?如果它确实没有意义。

1 个答案:

答案 0 :(得分:1)

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

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

保持代码清洁。