这两个 Guid 有何不同?

How are these two Guids different?

我有一个奇怪的错误。我正在将数据与 guid 配对,以便稍后识别它们并更改原始数据。

我能够将真正复杂的问题重新创建为一个我可以在这里提出的更简单的问题,因此我使用字符串作为数据的原因。以此为例:

  List<string> testList = new List<string>(new[] { "haha", "wit" });
  var list1 = testList.Select(x => new KeyValuePair<Guid, string>(Guid.NewGuid(), x));
  var list2 = list1.Select(x => new KeyValuePair<Guid, string>(x.Key, x.Value));
  Guid xGuid = list1.First().Key;
  Guid yGuid = list2.First().Key;

  System.Diagnostics.Debug.Print(xGuid.ToString());
  System.Diagnostics.Debug.Print(yGuid.ToString());
  System.Diagnostics.Debugger.Break();

只需要这段代码 运行 就可以了。在 visual studio 的输出 window 中,您应该看到两个 guid,就像这两个:

35ac8c6a-928c-46a9-a614-9d35c2427219
d2175358-85f8-4467-be02-34932f2f4804

注意:它们不一样

现在我的问题是:

如何,或者为什么它们甚至不同?

我在这里创建一个 guid:

var list1 = testList.Select(x => new KeyValuePair<Guid, string>(Guid.NewGuid(), x));

然后它只被复制:

var list2 = list1.Select(x => new KeyValuePair<Guid, string>(x.Key, x.Value));

那么为什么这些不同呢?

我该如何解决这个问题?

我想你已经遇到了 Linq 的魔力。试试这个:

var list1 = (your code).ToList()
var list2 = (your code).ToList()

看看你是否没有得到相同的值。 Linq 的 Select 每次都在您的代码中执行,每次都会产生一个新的 guid。我认为实际的术语是 Projection 和 Realization。