C# 如何转换列表<;对象>;到唯一id

C# 如何转换列表<;对象>;到唯一id,c#,list,C#,List,可能重复: 我有对象的列表,对象有ID、文件名、状态(枚举器)、日期戳、用户ID。 使用LinqI使用UserId过滤List并将其发送到Web应用程序 我需要为过滤结果获取某种类型的唯一Id,并在下次进行比较以检测当前用户的更改。如果为当前用户添加的新对象或现有对象的属性发生更改,唯一Id应不同 我曾尝试使用下面的代码来获取哈希代码,但每个myList对象的哈希代码都不同,即使对象和对象属性相同。有什么想法吗 myList= _queueList.GetItems(p => p.Use

可能重复:

我有
对象的
列表
,对象有ID、文件名、状态(枚举器)、日期戳、用户ID。
使用
Linq
I使用
UserId
过滤
List
并将其发送到Web应用程序

我需要为过滤结果获取某种类型的
唯一Id
,并在下次进行比较以检测当前用户的更改。如果为当前用户添加的新对象或现有对象的属性发生更改,
唯一Id
应不同

我曾尝试使用下面的代码来获取哈希代码,但每个myList对象的哈希代码都不同,即使对象和对象属性相同。有什么想法吗

myList= _queueList.GetItems(p => p.User.Id == userId)
                  .OrderByDescending(p => p.DateStamp)
                  .ToList();

myList.GetHashCode()

如果字符串很长,您可以生成md5或sha1并返回该字符串。

您可以像这样利用内置加密:

string hash = Convert.ToBase64String(
    new SHA1CryptoServiceProvider().ComputeHash(
        Encoding.UTF8.GetBytes(
            string.Join(":", myList.Select(obj => obj.Id.ToString()).ToArray()
        )));

我放置了
Convert.ToBase64String()
以使其对web友好(注意:如果您有许多记录,生成的字符串可能会变得很长!)

@DanielA.White这与此用法无关——唯一的要求是,如果数据更改,则id会更改。数据发生更改但哈希值意外保持不变的可能性非常小。一个好的散列应该是可以接受的。@karaken12关键是GetHashCode()不是用来做这个的。如果List提供的实现不是基对象.GetHashCode(),它不会告诉您任何关于内容唯一性的信息,我会感到惊讶。@drch这不正是它的用途吗?“哈希函数必须具有以下属性:如果两个对象比较相等,则每个对象的GetHashCode方法必须返回相同的值。”--如果希望两个列表在包含“相等”对象时相等,这似乎完全合适。请参阅Hans链接的问题。@karaken12列表的哈希代码不基于其内容。如果您试图查看对象列表是否已更改,GetHashCode()将帮不上忙。看见
string hash = Convert.ToBase64String(
    new SHA1CryptoServiceProvider().ComputeHash(
        Encoding.UTF8.GetBytes(
            string.Join(":", myList.Select(obj => obj.Id.ToString()).ToArray()
        )));