用随机值填充空的Guid列表的最简单方法

3
var ids = new List<Guid>(count);

我有一个空的多项列表,希望找到一种优雅的方式填充随机Guids,不使用for循环,最好是一行代码。

2个回答

8

虽然效率低下,但只有一行代码:

var list = Enumerable.Range(0, count).Select(_ => Guid.NewGuid()).ToList();

更高效:
var list = new List<Guid>(count);
for (int i = 0 ; i < count ; i++) list.Add(Guid.NewGuid());

如果列表已经存在,则只需使用第二个版本。你可能可以强制LINQ在不使用代码中的循环的情况下执行它,但是:不要这样做。因为你正在循环,所以……使用循环!将循环移到LINQ中并不能改善事情——它只会使阅读更加困难,并且执行效率更低。

@kamalpreet 我不认为这两者有很大的区别。它们在大部分情况下都是做同样的事情。 - Michael Puckett II
3
多个迭代器被构建和执行;一个委托被构建(尽管在���种情况下它将被缓存并重复使用作为静态委托),并被多次调用;列表大小不会被正确调整,因此当列表增长时(至少对于大的“count”值),它将使用多个数组。 - Marc Gravell
1
@MichaelPuckettII 关于结果是什么的问题:是的;关于他们如何达到目标的方法:请参考上面的评论。 - Marc Gravell
@MarcGravell 我同意,更简单的方式是胜利者(在我看来)。拥有两者可以使答案更强大,这是受人赞赏的。 - Michael Puckett II
@Fabjan 当然可以,但我认为这没有实现任何有用的东西 - 甚至只是 var list = DoTheThing(count); 隐藏了循环,但可以通过任何机制实现。 - Marc Gravell
显示剩余2条评论

0
也许这更符合你的口味,即使不完全符合你的要求?
    static IEnumerable<Guid> RandomGuids()
    {
        while (true) { yield return Guid.NewGuid(); }
    }

2
这个几乎很好,除了它是一个无尽的枚举。 - Michael Puckett II
您可以在调用的地方限制大小。RandomGuids().Take(count) - Leo Bartkus
你可以这样做,但通常只是调用枚举会一直执行下去。我认为在这种情况下这种行为并不理想。 - Michael Puckett II
@LeoBartkus 这是一个相当优雅的解决方案,谢谢你。不过,我更倾向于Marc建议的那个一行代码的解决方案。 - Andrei Karcheuski
@BanksySan 哦,我明白你的意思了:while (!count.Equals(0)) { yield return Guid.NewGuid(); count--; } - Andrei Karcheuski
1
@AndreiKarcheuski … 或者一个 for 循环。 - BanksySan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接