【问题标题】:c# getting a list from a field out of a listc# 从列表中的字段中获取列表
【发布时间】:2011-04-07 01:40:38
【问题描述】:

对于令人困惑的标题,我很抱歉,但我没有找到更好的方法来解释我的问题。

我有一个对象列表myList,我们称它们为MyObject。对象看起来像这样:

Class MyObject
{
    int MYInt{get;set;}
    string MYString{get;set;}
}

List<MyObject> myList;
...

我正在寻找一种很好的/简短的/花哨的方法来从myList 创建一个List&lt;string&gt;,我只使用MyString 属性。

我可以使用myList.forEach() 做到这一点,但我想知道是否有更好的方法

谢谢!!

【问题讨论】:

    标签: c# .net list foreach


    【解决方案1】:

    使用 LINQ:

    var list = myList.Select(o => o.MYString);
    

    返回一个IEnumerable&lt;string&gt;。要获得List&lt;string&gt;,只需添加对ToList() 的调用:

    var list = myList.Select(o => o.MYString).ToList();
    

    然后像往常一样迭代结果:

    foreach (string s in list)
    {
        Console.WriteLine(s);
    }
    

    【讨论】:

    • 值得一提的是,如果您只想遍历它,则不需要ToList()。仅当您需要修改新列表或对其进行索引时才使用它。
    【解决方案2】:

    如果您的输入和输出列表都是 List&lt;T&gt;,则不需要 LINQ。您可以改用ConvertAll 方法:

    List<string> listOfStrings = myList.ConvertAll(o => o.MYString);
    

    【讨论】:

    • 好吧,就我而言,输入和输出不一样。输入是 List,输出是 List。 convertAll() 还能工作吗?
    • “不需要 LINQ”是什么意思?你知道,LINQ 并不是一个完全独立的库或任何东西。无论您使用.ConvertAll 还是.Select 都没有实际区别。
    • @Timwi:正如它所说的那样:使用 LINQ 不是唯一可能的解决方案; ConvertAll 是另一种选择。事实上,ConvertAll 会比 LINQ 稍微高效一些,因为 (a) 它可以使用直接数组访问来复制数据,而不需要实例化和重复调用迭代器,并且 (b) 它可以在一开始就将目标列表分配到正确的大小,而不是动态地调整大小。 (但是,正如您所说,这种微小的性能优势在大多数现实世界的情况下没有实际差异。)
    【解决方案3】:

    这是使用集成查询语法的Ahmad's answer

    var strings = from x in myList
                  select x.MYString;
    
    List<string> list = strings.ToList();
    

    也可以这样写:

    List<string> list = (from x in myList
                         select x.MYString).ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 2018-12-23
      相关资源
      最近更新 更多