在方法的参数中使用IEnumerable <T>类型

mve*_*ith 4 c# collections parameters ienumerable

以前我用过IEnumerable<T>type,如果我把collection作为方法的参数传递.

但最近,我遇到了IEnumerable<T>以类似方式创建的类型集合的问题:

var peoples = names.Select(name => new People(name));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,总是,如果我使用集合人(例如,foreach),它会创建类People的新实例,并且很容易导致错误.

所以我想问一下使用IEnumerable <T>type参数是否正确.我认为这可能会导致问题(参见上面的示例),不应使用此类型.你推荐什么替代(ICollection<T>,IList<T>等),以及何时使用哪一种选择?

或者你认为这是一个愚蠢的问题,因为在Select方法中创建对象只使用傻瓜?

当然,我知道我可以使用ToArray()ToList()从而解决问题.但是使用这种方法的其他人,却无法知道.我想知道如何通过选择正确的类型参数来防止这种情况.当我想要"枚举"对象时,列表或数组对我来说太具体了.

aKz*_*enT 7

IEnumerable不是一个集合.这只是你可以"枚举"的东西.问题不是传递IEnumerable给你的方法,问题是如果你使用LINQ(Select方法),每次你读取可枚举时它将再次执行代码.如果您只想执行一次,可以使用ToArray()ToList()方法:

var peoples = names.Select(name => new People(name)).ToList();
Run Code Online (Sandbox Code Playgroud)

像这样你仍然可以将它传递给接受IEnumerable(或List)的任何方法,它只会为每个人创建一个实例.

编辑: 您的方法不应该担心这些问题.这是来电者的问题.使用可枚举而不是列表调用您的方法可能有充分的理由.调用者应该知道,如果将枚举传递给不同的方法,则枚举会给出不同的结果,因此您不必担心.

唯一的例外是如果在方法本身中多次枚举参数.在这种情况下,您应该将参数缓存在方法内的列表中,然后根据需要多次枚举列表.