我想为我在某个日期做的Linq查询的结果生成唯一标识符.最初我想过使用Guid,但我不得不即兴发现这个问题.但是,我想看看是否有人可以使用Guid解决方案,所以我们走了.
想象一下,我们有:
class Query
{
public class Entry
{
public string Id { get; set; }
public int Value { get; set; }
}
public static IEnumerable<Entry> GetEntries( IEnumerable<int> list)
{
var result =
from i in list
select new Entry
{
Id = System.Guid.NewGuid().ToString("N"),
Value = i
};
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们希望Id对于每个条目都是唯一的,但是我们需要这个值对于从GetEntries获得的IEnumerable的每次遍历都是相同的.这意味着我们要调用以下代码:
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
IEnumerable<Query.Entry> entries = Query.GetEntries(list);
Console.WriteLine("first pass");
foreach (var e in entries) { Console.WriteLine("{0} {1}", e.Value, e.Id); }
Console.WriteLine("second pass");
foreach (var e in entries) { Console.WriteLine("{0} {1}", e.Value, e.Id); }
Run Code Online (Sandbox Code Playgroud)
给我们这样的东西:
第一关
1 47f4a21a037c4ac98a336903ca9df15b 2 f339409bde22487e921e9063e016b717 3 8f41e0da06d84a58a61226a05e12e519 4 013cddf287da46cc919bab224eae9ee0 5 6df157da4e404b3a8309a55de8a95740
第二关
1 47f4a21a037c4ac98a336903ca9df15b 2 f339409bde22487e921e9063e016b717 3 8f41e0da06d84a58a61226a05e12e519 4 013cddf287da46cc919bab224eae9ee0 5 6df157da4e404b3a8309a55de8a95740
但是我们得到:
第一关
1 47f4a21a037c4ac98a336903ca9df15b 2 f339409bde22487e921e9063e016b717 3 8f41e0da06d84a58a61226a05e12e519 4 013cddf287da46cc919bab224eae9ee0 5 6df157da4e404b3a8309a55de8a95740
第二关
1 a9433568e75f4f209c688962ee4da577 2 2d643f4b58b946ba9d02b7ba81064274 3 2ffbcca569fb450b9a8a38872a9fce5f 4 04000e5dfad340c1887ede0119faa16b 5 73a11e06e087408fbe1909f509f08d03
现在我再看看上面的代码,我意识到我的错误在哪里:将ID分配给Guid.NewGuid().每次遍历集合时都会调用ToString("N"),因此每次都不同.
那我该怎么办呢?有没有办法让我放心,我每次都只能收到一份该系列的副本?有没有办法确定我不会得到查询结果的新实例?
感谢您提前的时间:)
这是所有LINQ查询固有的.可重复是巧合,不保证.
你可以用a解决它.ToList(),比如:
IEnumerable<Query.Entry> entries = Query.GetEntries(list).ToList();
Run Code Online (Sandbox Code Playgroud)
或者更好,移动.ToList()内部GetEntries()
| 归档时间: |
|
| 查看次数: |
3522 次 |
| 最近记录: |