えんの付箋紙と小さなダンボールの中

LOLとかスマホゲームとかたまに開発も サモナーネーム: enpel

Subscribe内で他のDictionaryをClearしたら変な挙動になった

protected Dictionary<eFilter, List<Item>> ItemMap = new Dictionary<eFilter, List<Item>>();
public ReactiveProperty<List<Item>> ItemList = new ReactiveProperty<List<Item>>();

void Awake()
{
    ItemList.Subscribe(items => {
    // ItemListが更新されたらItemMapを一度Clearしたい
        ItemMap.Clear();
        if (ItemMap.ContainsKey(eFilter.NONE))
            ItemMap.Add(eFilter.NONE, items);
        else
            ItemMap[eFilter.NONE] = items;
    }).AddTo(this);
}

// ItemListを更新する奴。更新は外から呼ばれる
public void UpdateItemList (List<Item> infos)
{
    ItemList.Value = infos;
}

// 特定のクラスコードでフィルタされたItemのListをItemMapから取得したい。
// なければその場でフィルタしたものを作ってItemMapに保存してそれを返す
private List<Item> GetItemList(eFilter filterType)
{
// ここが返す値がItemListのSubscribeでClearしてるにもかかわらず古い情報を返していた。
    if (!ItemMap.ContainsKey(filterType)){
        ItemMap.Add(filterType, ItemList.Value.Where(item => item.GetFilterType() == filterType).ToList());
    }

    return ItemMap[filterType]; 
}

解決した結果こうなった

void Awake()
{
}

// ItemListを更新する奴。更新は外から呼ばれる
public void UpdateItemList (List<Item> infos)
{
    ItemList.Value = infos;

    // ItemListが更新されたらItemMapを一度Clearしたい
    ItemMap.Clear();
    if (ItemMap.ContainsKey(eFilter.NONE))
        ItemMap.Add(eFilter.NONE, items);
    else
        ItemMap[eFilter.NONE] = items;
}

いみわからん…

(一部外出し用にReplaceしたコードがあるから意味不明になってそう)