我想将一个简单的对象序列化为JSON:
public class JsonTreeNode
{
[DataMember(Name = "title")]
public string Title { get; set; }
[DataMember(Name = "isFolder")]
public bool IsFolder { get; set; }
[DataMember(Name = "key")]
public string Key { get; set; }
[DataMember(Name = "children")]
public IEnumerable<JsonTreeNode> Children { get; set; }
[DataMember(Name = "select")]
public bool SelectedOnInit { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但每当我这样做:
return Json(tree, JsonRequestBehavior.AllowGet);
Run Code Online (Sandbox Code Playgroud)
属性名称不作为指定[DataMember]部分,但类似的情况在类如直接定义的那些的SelectOnInit它不是select,但SelectOnInit.
我究竟做错了什么?
我在C#中有一个Address类,如下所示:
public class Address
{
public string StreetAddress { get; set; }
public string RuralRoute { get; set; }
public string City { get; set; }
public string Province { get; set; }
public string Country { get; set; }
public string PostalCode { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我正在实现相等性,所以我需要覆盖哈希码.起初我打算使用EJ的哈希码公式,但后来我想:这些都是字符串字段,我不能只使用StringBuilder连接它们并从该字符串返回哈希码?
那是:
var str = new StringBuilder();
str.Append(StreetAddress)
.Append(RuralRoute)
...
return str.ToString().GetHashCode();
Run Code Online (Sandbox Code Playgroud)
这有什么优点/缺点?我为什么不这样做?
我已将Dictionary(TKey,TValue)用于多种用途.但我没有遇到任何实现GetHashCode()的场景,我认为这是因为我的键是主要类型,如int和string.我很想知道场景(真实世界的例子),当一个人应该使用自定义对象的键,从而实现方法GetHashCode()Equals()等.
并且,使用自定义对象的密钥是否需要实现这些功能?
长话短说:我有2个对象集合.一个包含好的值(让我们称之为"好"),其他默认值(先生"默认").我希望联盟的相交在良好和默认之间,以及默认.换句话说:相交(联合(良好,默认),默认).有人可能认为它解析为默认值,但这里是棘手的:我使用自定义IEqualityComparer.
我得到了以下课程:
class MyClass
{
public string MyString1;
public string MyString2;
public string MyString3;
}
class MyEqualityComparer : IEqualityComparer<MyClass>
{
public bool Equals(MyClass item1, MyClass item2)
{
if(item1 == null && item2 == null)
return true;
else if((item1 != null && item2 == null) ||
(item1 == null && item2 != null))
return false;
return item1.MyString1.Equals(item2.MyString1) &&
item1.MyString2.Equals(item2.MyString2);
}
public int GetHashCode(MyClass item)
{
return new { item.MyString1, item.MyString2 }.GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我的收藏品Good和Default集合的特征:
默认值:它是一个很大的集合,包含所有想要的{MyString1,MyString2}对,但是你可以猜测,MyString3值是默认值.
好:它是一个较小的集合,主要包含默认集合中的项目,但具有一些好的MyString3值.它还有一些{MyString1,MyString2},它们位于想要的集合之外.
我想要做的是:只获取Good中默认的项目,但将Default中的其他项目添加到默认项目中.
这是我认为最好的尝试:
HalfWantedResult = Good.Union(Default, …Run Code Online (Sandbox Code Playgroud) 这个问题关系到这一个,但我认为应该分开询问.
我有一个复杂的对象实例图.现在,我想在内存中直接创建一个校验和,以检测自上次校验和与对象图一起保存以来是否对其进行了更改.校验和计算应该很快,不应该消耗太多内存.
据我所知,现在最好的解决方案可能是在对象图的二进制序列化形式上生成加密密钥(如果我错了,请纠正我).但这有几个问题:
更新:
您如何看待这种方法:
提到的GetHashCode算法应该快速计算一个哈希码,该哈希码对于仅考虑其原始成员的单个对象来说是非常安全的.基于此,字节数组也应该是对象图的相当碰撞安全表示以及此处的MD5/CRC散列.
我希望有一个使用整数数组作为键的字典,如果整数数组具有相同的值(甚至是不同的对象实例),它们将被视为相同的键.我该怎么办?
以下代码b不同,因为不同的对象实例.
int[] a = new int[] { 1, 2, 3 };
int[] b = new int[] { 1, 2, 3 };
Dictionary<int[], string> dic = new Dictionary<int[], string>();
dic.Add(a, "haha");
string output = dic[b];
Run Code Online (Sandbox Code Playgroud) 我有两个列表,我想比较.所以我创建了一个实现IEqualityComparer接口的类,请参见下面的代码底部.
当我单步GetHashCode执行代码时,代码会通过我的实现而不是Equals?GetHashCode尽管在互联网上阅读以及它到底在做什么,但我并不真正理解这种方法.
List<FactorPayoffs> missingfactorPayoffList =
factorPayoffList.Except(
factorPayoffListOrg,
new FactorPayoffs.Comparer()).ToList();
List<FactorPayoffs> missingfactorPayoffListOrg =
factorPayoffListOrg.Except(
factorPayoffList,
new FactorPayoffs.Comparer()).ToList();
Run Code Online (Sandbox Code Playgroud)
所以在上面的两行代码中,两个列表返回每个项目,告诉我这两个列表不包含任何相同的项目.事实并非如此,只有不同的行.我猜这种情况正在发生,因为该Equals方法没有被调用,这反过来让我想知道我的GetHashCode方法是否正常运作?
class FactorPayoffs
{
public string FactorGroup { get; set; }
public string Factor { get; set; }
public DateTime dtPrice { get; set; }
public DateTime dtPrice_e { get; set; }
public double Ret_USD { get; set; }
public class Comparer : IEqualityComparer<FactorPayoffs>
{
public bool Equals(FactorPayoffs x, FactorPayoffs y)
{ …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码:
struct Vec2 : IEquatable<Vec2>
{
double X,Y;
public bool Equals(Vec2 other)
{
return X.Equals(other.X) && Y.Equals(other.Y);
}
public override bool Equals(object obj)
{
if (obj is Vec2)
{
return Equals((Vec2)obj);
}
return false;
}
// this will return the same value when X, Y are swapped
public override int GetHashCode()
{
return X.GetHashCode() ^ Y.GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
除了比较双精度的平等对话(这只是演示代码)之外,我关注的是当X,Y值被交换时存在哈希冲突.例如:
Vec2 A = new Vec2() { X=1, Y=5 };
Vec2 B = new Vec2() { X=5, Y=1 };
bool test1 = …Run Code Online (Sandbox Code Playgroud) 我有以下职位类别:
public struct Pos
{
public int x;
public int y;
public float height;
public Pos (int _x, int _y, float _height)
{
x = _x;
y = _y;
height = _height;
}
public override string ToString ()
{
return x.ToString() + "," + y.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
但是因为我打了Pos.ToString()几千次电话,这对我来说太慢了.我只需要一种基于Pos.x和获取单个唯一值的有效方法Pos.y,用作字典键.注意:我无法使用,Pos因为我正在比较Poson x和的不同实例y.
我正在尝试获取对象的哈希值(md5或sha).
我实现了这个:http: //alexmg.com/post/2009/04/16/Compute-any-hash-for-any-object-in-C.aspx
我正在使用nHibernate从数据库中检索我的POCO.
在此运行GetHash时,每次从数据库中选择并保湿时都会有所不同.我想这是预期的,因为底层代理会改变.
无论如何,
有没有办法在对象上获取所有属性的哈希值,每次都是一致的?
我已经玩弄了使用StringBuilder而不是this.GetType().GetProperties .....并在其上创建哈希,但这似乎效率低下的想法?
作为旁注,这是用于将这些实体从一个数据库(RDBMS)更改跟踪到NoSQL存储(比较哈希值以查看rdbms和nosql之间是否更改了对象)
c# ×8
.net ×3
hash ×2
hashcode ×2
arrays ×1
checksum ×1
dictionary ×1
equality ×1
iequatable ×1
intersect ×1
intersection ×1
json ×1
linq ×1
performance ×1
point ×1
properties ×1
string ×1
tostring ×1