【问题标题】:Why do I get different object form same source by different way?为什么我通过不同的方式从同一来源获得不同的对象?
【发布时间】:2019-07-23 20:03:33
【问题描述】:

我创建了一个静态类,其中包含了全局变量和函数的定义,但可能是错误的。

我需要创建一个购物车,刷新后内容不应该丢失。

在静态类 A 中,我创建了静态变量 ObservableCollection Collection1 和 Collection2(Collection1 有子但 Collection2)和静态函数 Refresh() 用于刷新 Collection1。

在动态类B中,获取一些children,添加到Collection2中,然后使用A.Refresh(),在刷新的过程中,如果新数据的id与旧Collection2中的任何一个id相同,则将其添加到new中收藏2。

public class Model
{
        public Guid Id{ get; set; }
        public string Name{ get; set; }
}

public static class A
{
        public static ObservableCollection<Model> Collection1 { get; set; } = new ObservableCollection<Model>();

        public static ObservableCollection<Model> Collection2 { get; set; } = new ObservableCollection<Model>();


        public static Refresh()
        {
            var uidList = Collection2.Select(x => x.Id).ToList();
            Collection1.Clear();
            Collection2.Clear();
            foreach (var item in dataFromServer)
            {
                var newModel = new Model{Id = item.Id};
                Collection1.Add(newModel);
                if(uidList.Contains(item.Id))
                {
                    Collection2.Add(newModel);
                }
            }
        }
}

public class B
{
        public B()
        {
            A.Refresh();
        }

        public AddToCart(Guid id)
        {
            var model = A.Collection1.First(x=>x.Id == id);
            if (!A.Collection2.Contains(model))
            {
                A.Collection2.Add(model);
            }
        }

        public Refresh()
        {
            A.Refresh();
        }
}

我使用 B.AddToCart(AAAA) 将子项添加到 Collection2,然后使用 B.Refresh(),现在我有新的数据表单服务器,Collection1 和 Collection2 中有一个新对象(Id 为 AAAA)。然后我使用B.AddToCart(AAAA) 再次,现在 Collection2 有两个具有相同 Id 和 Name 的孩子,即使我改变了一个,另一个的名字也改变了。这意味着 Collection2 中有相同的两个对象对吗?但是为什么 A.Collection2 .Contains(model) return false?我用 Object.ReferenceEquals 检查了两个孩子,结果也是 false。 我知道 Collection2.Any(x=>x.Id==id) 可以工作,我只是想知道它是怎么发生的。

编辑:我创建了一个演示,但他的问题没有再次出现,可能是其他部分有问题。

【问题讨论】:

    标签: c# .net wpf


    【解决方案1】:

    您需要在 Model 类上实现 IEquatable&lt;Model&gt;

    这是一个重复的问题,参考:ObservableCollection.Contains() Doesn't Work Correctly

    【讨论】:

    • 这并不能解释为什么object.ReferenceEquals 会失败。
    • 在刷新过程中,Collection1和Collection2的children同时刷新。
    • 我创建了一个demo,但他的问题没有再次出现,可能是其他部分有问题。还是谢谢你。
    • @SebastianSchumann 问题中的代码与问题文本不相关。当 var newModel = new Model{Id = item.Id}; 从未设置名称时,Collection1 和 Collection2 如何包​​含具有相同名称(除了 null)的 Model 项?
    • @SebastianSchumann 如果我是一个赌徒,我敢打赌,在 AddToCart 中的if (!A.Collection2.Contains(model)) 会出现未显示的真实代码问题。具体来说,前面的行可能是在做.Select(x =&gt; new Model{...}) shenanigans,这将返回一个与 Collection2 中实际不同的对象实例,因此总是无法通过测试。鉴于示例代码,我想知道为什么 Collection2 不是 ObservableCollection&lt;Guid&gt;List&lt;Guid&gt; - 至少 GuidIEquatable。除了 OP 的示例中显示的内容之外,还有更多内容。
    猜你喜欢
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多