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));

なぜ私はこれをしなければならなかったのですか?「dataCollector」に「dc」を追加すると、「dataGrid」へのリンクが作成されますか?もしそうなら、それは意味がありません。

4

1 に答える 1

1

dataCollector.Add(dc)これは、参照をオブジェクトのメモリ ロケーションにコピーするためです。したがって、同じオブジェクトへのポインタを保持しているため、その場所でのデータへの変更はどちらのコレクションにも反映されます。代わりにできることは、コピー コンストラクターを模倣することです。

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

コードをきれいに保ちます。

于 2012-10-17T21:29:48.010 に答える