【问题标题】:C# extracting ID from list of structures using LINQC# 使用 LINQ 从结构列表中提取 ID
【发布时间】:2015-10-11 23:47:50
【问题描述】:

我有一个结构列表:

struct MyStruct{
    int ID;
    string name;
    string surname;
}
List<MyStruct> list1 = new List<MyStruct>();
///here the list is being updated so that it has some elements

现在我想从 list1 中提取所有 ID 并放入另一个列表:

List<int> list2 = new List<int>();
list2.AddRange(list1.GetIds() /*LINQ HERE*/);

诀窍是我想使用 LINQ 来完成它,但我仍然不太了解它。我知道它可以用普通的 for 循环 来完成,但 我想使用 AddRange 和 LINQ

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    我认为GetIds 不存在,而您想使用 LINQ 来代替。你需要的方法是Enumerable.Select:

    list2.AddRange(list1.Select(x => x.ID));
    

    您也可以使用ToList 代替AddRange

    List<int> list2 = list1.Select(x => x.ID).ToList();
    

    微/过早优化提示:AddRangeToList 如果不是集合,则不知道输入序列的大小。因此,他们枚举序列并使用List.Add 添加项目。这会导致支持数组的大小调整。它也可以导致higher memory consumption than necessary

    您可以通过以下方式规避它:

    List<int> list2 = new List<int>(list1.Count);
    list2.AddRange(list1.Select(x => x.ID));
    

    【讨论】:

    • 是的,你猜对了,我只是把 GetIds 放在那里,因为我知道应该放一些命令来提取 Id,我在考虑 Select 但不确定如何使用它。谢谢你:)
    【解决方案2】:

    您可以使用Select 方法。例如:

    List<int> list2 = new List<int>();
    var allIds = list1.Select(n => n.ID);
    list2.AddRange(allIds);
    

    如果您的列表为空,您不必使用AddRange 方法。您应该将Select 方法的结果分配给您的目标列表。

    【讨论】:

      【解决方案3】:

      试试这个,

         list2.AddRange(list1.Select(C => C.ID).ToList());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-10
        • 1970-01-01
        相关资源
        最近更新 更多