C# 用随机值填充guid空列表的最简单方法 var id=新列表(计数);

C# 用随机值填充guid空列表的最简单方法 var id=新列表(计数);,c#,linq,C#,Linq,我有一个多项目的空列表,我正在寻找一种优雅的方法,用随机guid填充它,而不使用for循环,最好是一行。效率低下,但只有一行: var ids = new List<Guid>(count); 效率更高: var list = Enumerable.Range(0, count).Select(_ => Guid.NewGuid()).ToList(); var列表=新列表(计数); 对于(inti=0;i

我有一个多项目的空列表,我正在寻找一种优雅的方法,用随机guid填充它,而不使用for循环,最好是一行。

效率低下,但只有一行:

var ids = new List<Guid>(count);
效率更高:

var list = Enumerable.Range(0, count).Select(_ => Guid.NewGuid()).ToList();
var列表=新列表(计数);
对于(inti=0;i

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

也许这更符合您的口味,即使这不是您所要求的

var list = new List<Guid>(count);
for (int i = 0 ; i < count ; i++) list.Add(Guid.NewGuid());
static IEnumerable RandomGuids()
{
while(true){yield return Guid.NewGuid();}
}

您能为两者之间的差异添加更多细节吗?我喜欢第一个选项,而不调用
ToList()
,因为它总是会生成一个新的guid列表。您可以随时在调用端调用
ToList()
,以保留这些引用。@kamalpreet我不认为这两者有什么大的区别。它们在大多数情况下都做同样的事情。@kamalpreet构造并执行了多个迭代器;一个委托被构造(尽管在这种情况下它将被缓存并作为一个静态对象重用),并被多次调用;该列表的大小不合适,因此它将在增长时使用多个数组(至少对于大的
计数
)@MichaelPuckettII,其结果是:是;关于他们如何做到这一点:见上面的评论这几乎很棒,只是它是一个无休止的枚举。你可以在调用站点限制大小
RandomGuids().Take(count)
你可以;但一般来说,仅仅调用枚举将永远消失。我认为在这种情况下,这种行为并不理想。@LeoBartkus这是一个非常优雅的解决方案谢谢你,我对Marc建议的那一行做了更多的解释though@AndreiKarcheuski…或for循环。
    static IEnumerable<Guid> RandomGuids()
    {
        while (true) { yield return Guid.NewGuid(); }
    }