C# 这两个guid有何不同?

C# 这两个guid有何不同?,c#,linq,guid,C#,Linq,Guid,我有一个奇怪的错误。我正在将数据与guid配对,以便以后识别它们并更改原始数据 我能够将这个非常复杂的问题重新创建成一个更简单的问题,我可以在这里问这个问题,因此我为什么要使用字符串作为数据。把这个看作是一个例子: List<string> testList = new List<string>(new[] { "haha", "wit" }); var list1 = testList.Select(x => new KeyValuePair<Gui

我有一个奇怪的错误。我正在将数据与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();
注意:它们不一样

现在我的问题是:

它们有什么不同,或者为什么不同

我在这里创建一个guid:

var list1 = testList.Select(x => new KeyValuePair<Guid, string>(Guid.NewGuid(), x));
var list1=testList.Select(x=>newkeyvaluepair(Guid.NewGuid(),x));
然后它只会被复制:

var list2 = list1.Select(x => new KeyValuePair<Guid, string>(x.Key, x.Value));
var list2=list1.Select(x=>newkeyvaluepair(x.Key,x.Value));
那么为什么这些不同呢


我怎样才能解决这个问题

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

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

看看你是否得到了相同的值。Linq的Select在代码中每次都会执行,每次都会产生一个新的guid。我想,实际的术语是投影和实现。

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

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

看看你是否得到了相同的值。Linq的Select在代码中每次都会执行,每次都会产生一个新的guid。我认为,实际条件是投影和实现。

延迟执行。将
ToList
放在
list1
赋值的末尾,它将是相同的值。基本上
Guid.NewGuid
list1
list2
上首先调用
时会被调用两次。您正在创建两个LINQ查询-每次访问它们时都会在
Select
lambda中重新运行代码。@Damien\u不信者哦-看起来像是懒惰的评估再次对我说:pDelayed执行。将
ToList
放在
list1
赋值的末尾,它将是相同的值。基本上
Guid.NewGuid
list1
list2
上首先调用
时会被调用两次。你在创建两个LINQ查询-每次访问它们时都会在
Select
lambda中重新运行代码。@Damien\u不信者哦-看起来像是懒惰的评估再次对我说:我想一想这就解决了是的。这是因为linq的某些部分是通过惰性执行(当您请求数据时执行)实现的吗?@Mafii是的,这正是发生的情况。为了解释,在原始代码中,
List1
不是一个列表,而是一个IEnumerable对象,这将在每次运行时生成一个新的列表。这是一个糟糕的答案-提供的代码与问题不匹配,并且解释也不是很清楚。它应该改进。@Enigmativity虽然我同意这不是一个完美的答案,但它解决了问题,只是在更抽象的层面上。很清楚我的问题的解决方案是什么,但可以更清楚地知道何时使用ToList()和何时不使用。我认为这解决了问题是的。这是因为linq的某些部分是通过惰性执行(当您请求数据时执行)实现的吗?@Mafii是的,这正是发生的情况。为了解释,在原始代码中,
List1
不是一个列表,而是一个IEnumerable对象,这将在每次运行时生成一个新的列表。这是一个糟糕的答案-提供的代码与问题不匹配,并且解释也不是很清楚。它应该改进。@Enigmativity虽然我同意这不是一个完美的答案,但它解决了问题,只是在更抽象的层面上。我的问题的解决方案很清楚,但何时使用ToList()和何时不使用,可能会更清楚。