2012-10-17 16 views
1

我找到了解决我的问题的方法,但我想知道是否有人可以解释为什么会发生这种情况。List <T>修改ObservableCollection <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; 
    } 
} 

在我的代码中,我有一个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

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

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

它有点让你的代码干净。

+1

打败我吧。 +1 – Arrow

+1

@JamesKent对不起大声笑:P –

+1

大声笑,道歉接受! :P – Arrow

相关问题