【问题标题】:C# use dictionary with "non-standard" types [duplicate]C#使用具有“非标准”类型的字典[重复]
【发布时间】:2013-09-25 11:55:36
【问题描述】:

我正在使用电子计算引擎进行开发,其中所有对象都是 WDataObject 类型。

我有一个类可以创建适用于字符串值的图形,但现在我需要创建这些 WDataObjects 的图形。

要查看一个 WDataObject 是否等于其他 WDataObject,我必须使用自己的方法:.isEqual(WDataObject obj)

因此,如果我创建一个类似的字典

Dictionary<WDataObject , LinkedList<WDataObject>> map = new Dictionary<WDataObject , LinkedList<WDataObject>>( );

我无法正常从键中获取值,而是必须创建迭代器并手动检查等效性。

我有这个功能很好:

public void addOneWayRelation ( string node1 , string node2 ) {
            LinkedList<string> adjacent = new LinkedList<string>( );
            try {
                adjacent = map[node1];
            } catch ( System.Collections.Generic.KeyNotFoundException ) {
                map[node1] = adjacent;
            }
            adjacent.AddLast( node2 );
        }

我需要将类型从字符串更改为 WDataObject。

我已经有了关键字搜索

private LinkedList<WDataObject> searchKey ( WDataObject k ) {
            List<WDataObject> Keys = new List<WDataObject>( map.Keys );
            List<LinkedList<WDataObject>> Values = new List<LinkedList<WDataObject>>( map.Values );

            for ( int i = 0 ; i < Keys.Count ; i++ ) {
                if ( Keys[i].IsEqual( k ) ) {
                    return Values[i];
                }
            }
            return null;
        }

问题是

map[node1] = adjacent;

如何在这种情况下从特定键替换值?

感谢任何帮助。

【问题讨论】:

  • 有什么理由不重写Equals 方法吗?
  • 你为什么不使用 Dictionary
  • 对于搜索键,您应该使用:return map.ContainsKey(k) ? map[k] : null;。您应该为字典创建一个相等比较器并将其作为参数传递给它的构造函数。
  • 是的问题类似,我会尝试公共类 FooEqualityComparer : IEqualityComparer { public int GetHashCode(Foo foo) { return foo.FooID.GetHashCode(); } public bool Equals(Foo foo1, Foo foo2) { return foo1.FooID == foo2.FooID; } }
  • 您不需要相等比较器,只需覆盖 WDataObject 中的 GetHashCode 和 Equal 方法。这样就行了!

标签: c# dictionary


【解决方案1】:

感谢您的指示,此代码解决了问题:

Dictionary<WDataObject , LinkedList<WDataObject>> map = new Dictionary<WDataObject , LinkedList<WDataObject>>( new EqualityComparer( ) );

任何使用字典的代码

public class EqualityComparer : IEqualityComparer<WDataObject> {
        public int GetHashCode ( WDataObject obj ) { return obj.GetHashCode( ); }
        public bool Equals ( WDataObject obj1 , WDataObject obj2 ) { return obj1.IsEqual( obj2 ); }
    }

【讨论】:

    猜你喜欢
    • 2017-06-03
    • 2014-12-27
    • 1970-01-01
    • 2013-11-21
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    相关资源
    最近更新 更多