linq select中的System.Guid.NewGuid()

Eli*_*nis 2 c# linq

我想为我在某个日期做的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"),因此每次都不同.

那我该怎么办呢?有没有办法让我放心,我每次都只能收到一份该系列的副本?有没有办法确定我不会得到查询结果的新实例?

感谢您提前的时间:)

Hen*_*man 6

这是所有LINQ查询固有的.可重复是巧合,不保证.

你可以用a解决它.ToList(),比如:

IEnumerable<Query.Entry> entries = Query.GetEntries(list).ToList();
Run Code Online (Sandbox Code Playgroud)

或者更好,移动.ToList()内部GetEntries()