dictionary의 요소인 Class의 멤버 List에 데이터 추가하기

코드로 표시

public class siteInfo : IDisposable
{
	public string sitename;
	public double temp;
	public List<double> lst_temp = null;
	
	public siteInfo(string _sitename)
	{
		this.sitename = _sitename;
		this.lst_temp = new List<double>();
	}
	
	public void Dispose() {}
}

double temp = 0;
public static Dictionary<string, siteInfo> dictSite = new Dictionary<string, siteInfo>();

siteInfo site1 = new siteInfo("site1");
dictSite.Add("site1", site1);

siteInfo site2 = new siteInfo("site2");
dictSite.Add("site2", site2);

void updateData()
{
	foreach(KeyValuePair<string, siteInfo> site in dictSite)
	{
		temp = temp + 1;
		site.Value.temp = temp;
		site.Value.lst_temp.Add(temp);	// <===
	}
}

class의 멤버 변수들은 많은데, 우선 위에 정리한 코드처럼 Dictionary에 요소로 class를 정의하고, class는 List를 멤버로 가지고 있습니다. dictionary의 데이터를 업데이트하기 위해 foreach문을 이용해서 데이터 갱신을 하면서 List에 데이터를 추가할려고 합니다.

이때 temp 데이터는 갱신이 됩니다. 그런데 List는 함수내에서는 데이터 Add 후, List의 Count가 1이 되었다가 다시 함수가 호출되면, Count가 0이 됩니다.

class의 IDisposable 및 Dispose()를 삭제해도 안되고, foreach 문은 dictionary의 내용이 수정이 안된다는 글도 있어서 for 문을 사용해도 동일한 증상입니다.

이렇게 사용하면 안되는 것인지요? 아니면 다르게 데이터를 관리하는 유사한 방법이 있을까요?

관심 감사드립니다.

1개의 좋아요

공유해주신 재현 코드로는 정상적으로 동작을 합니다.

updateData()를 호출할 수록 정상적으로 목록에 값이 누적 추가되는데요, 아마도 다른 요인 때문에 리스트의 목록이 초기화 되는 것으로 생각됩니다.

1개의 좋아요

아…네에 감사합니다. 코드가 길어서 이리저리 해봐도 안되어 질문드렸는데, 더 찾아봐야겠습니다.

1개의 좋아요

다시 테스트를 해보니, 딕셔너리에 add 된 아이템이 2~3개일 때는 List에 add가 잘 됩니다만, 딕셔너리에 add된 아이템이 100개를 넘어가니 동일한 증상이 발생을 발생을 합니다. 아이템내에 List가 10개 정도밖에 안되는데, GC는 아니겠지요?

1개의 좋아요

아닙니다. 위의 샘플은 정상 동작합니다. 아래 200번 반복을 해서 add된 아이템이 200개가 되게 했을 때 출력 결과 입니다.

double temp = 0;
Dictionary<string, siteInfo> dictSite = new Dictionary<string, siteInfo>();

siteInfo site1 = new siteInfo("site1");
dictSite.Add("site1", site1);

siteInfo site2 = new siteInfo("site2");
dictSite.Add("site2", site2);

for (var i = 0; i < 200; i++)
    updateData();

foreach (var site in dictSite)
{
    Console.WriteLine($"site.Value.temp = {site.Value.temp}");
    Console.WriteLine($"site.Value.lst_temp.Count = {site.Value.lst_temp.Count}");
}

void updateData()
{
    foreach (KeyValuePair<string, siteInfo> site in dictSite)
    {
        temp = temp + 1;
        site.Value.temp = temp;
        site.Value.lst_temp.Add(temp);  // <===
    }
}

public class siteInfo : IDisposable
{
    public string sitename;
    public double temp;
    public List<double> lst_temp = null;

    public siteInfo(string _sitename)
    {
        this.sitename = _sitename;
        this.lst_temp = new List<double>();
    }

    public void Dispose() { }
}

| 출력

site.Value.temp = 399
site.Value.lst_temp.Count = 200
site.Value.temp = 400
site.Value.lst_temp.Count = 200

위의 코드 말고 lst_temp를 참조하는 코드를 추적해서 목록을 초기화 하는 로직을 살펴보셔야 할 듯 합니다.

2개의 좋아요

딕셔너리에 있는 리스트의 해쉬값과 개수가 안늘어났을때의 리스트의 해쉬값을 비교 고고싱!

2개의 좋아요