创建 N 个对象并将它们添加到列表中

Posted

技术标签:

【中文标题】创建 N 个对象并将它们添加到列表中【英文标题】:Creating N objects and adding them to a list 【发布时间】:2013-08-09 23:01:41 【问题描述】:

我有一个方法,它接受 N,我要创建的对象的数量,我需要返回 N 个对象的列表。

目前我可以用一个简单的循环来做到这一点:

    private static IEnumerable<MyObj> Create(int count, string foo)
    
        var myList = new List<MyObj>();

        for (var i = 0; i < count; i++)
        
            myList .Add(new MyObj
                
                    bar = foo
                );
        

        return myList;
    

我想知道是否还有其他方法,也许使用 LINQ 来创建这个列表。

我试过了:

    private static IEnumerable<MyObj> CreatePaxPriceTypes(int count, string foo)
    
        var myList = new List<MyObj>(count);

        return myList.Select(x => x = new MyObj
            
                bar = foo
            );

    

但这似乎确实填充了我的列表。

我尝试将选择更改为 foreach,但它的处理相同。

我意识到该列表具有 容量 的 count 并且 LINQ 没有找到任何要迭代的元素。

        myList.ForEach(x => x = new MyObj
        
            bar = foo
        );

是否有正确的 LINQ 运算符可用于使其工作?还是我应该坚持循环?

【问题讨论】:

LINQ 是一个查询工具,不应该过度使用它来创建对象 .Select() 这样的Linq 运算符纯粹用于查询集合并将它们投影到所需的形式;他们不打算做任何改变原始设置的事情。不建议您尝试使用 .Select() 做什么,尽管它可以工作。我会坚持循环。 这可能有点价值:blogs.msdn.com/b/ericlippert/archive/2009/05/18/… 如果你想增加趣味,你可以使用yield return new MyObj() ... ; 而不是保存临时列表 MyObj[100].AsEnumerable() 不行吗? 【参考方案1】:

您可以使用Range 创建序列:

return Enumerable.Range(0, count).Select(x => new MyObj  bar = foo );

如果你想创建一个List,你必须ToList它。

但请注意,它(可以说)是一个不明显的解决方案,所以暂时不要放弃创建列表的迭代方式。

【讨论】:

有趣,Repeat 方法怎么样?那做同样的事情吗?还是只创建一个对象,并创建一个指针列表来引用该对象? 在这种特殊情况下,它是Range 还是Repeat 都没有关系,因为您不使用Select 中的对象。重要的是它会生成一个包含 N 个元素的序列,您需要创建恰好 N 个新对象...【参考方案2】:

您可以创建通用的辅助方法,如下所示:

// Func<int, T>: The int parameter will be the index of each element being created.

public static IEnumerable<T> CreateSequence<T>(Func<int, T> elementCreator, int count)

    if (elementCreator == null)
        throw new ArgumentNullException("elementCreator");

    for (int i = 0; i < count; ++i)
        yield return (elementCreator(i));


public static IEnumerable<T> CreateSequence<T>(Func<T> elementCreator, int count)

    if (elementCreator == null)
        throw new ArgumentNullException("elementCreator");

    for (int i = 0; i < count; ++i)
        yield return (elementCreator());

然后你可以像这样使用它们:

int count = 100;

var strList = CreateSequence(index => index.ToString(), count).ToList();

string foo = "foo";
var myList = CreateSequence(() => new MyObj Bar = foo , count).ToList();

【讨论】:

这对我来说可能更复杂,但对其他人可能更有用【参考方案3】:

你可以使用 Enumerable.Repeat

IEnumerable<MyObject> listOfMyObjetcs = Enumerable.Repeat(CreateMyObject, numberOfObjects);

更多信息请阅读https://msdn.microsoft.com/en-us/library/bb348899(v=vs.110).aspx

【讨论】:

恐怕这会生成一个由单个值填充的集合 澄清@IliaMaskov 的评论:Repeatvalue 很有用;例如制作0s 的序列,但不能按照问题中的要求创建独立的对象。创建0s 列表:var myList = Enumerable.Repeat(0, count).ToList();,其中count 是要创建的元素数。

以上是关于创建 N 个对象并将它们添加到列表中的主要内容,如果未能解决你的问题,请参考以下文章

检查变量并将它们添加到逗号分隔列表中

在迭代期间将对象添加到现有列表

如何创建带有按钮的视图并将它们添加到 UITableViewController [关闭]

拆分所有列表框元素并将它们全部添加到新的字符串数组中

如何在字符串中查找多个子字符串并将它们添加到列表中? [复制]

使用 listView 和适配器显示对象