C# 这两个guid有何不同?
我有一个奇怪的错误。我正在将数据与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
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()和何时不使用,可能会更清楚。