【问题标题】:How to Add objects to an immutable generic List using Select() Extension Method如何使用 Select() 扩展方法将对象添加到不可变的通用列表
【发布时间】:2011-06-09 18:06:27
【问题描述】:

我有一个不可变的列表。

在下面的 g.Select(...) 中,我执行了一个放入 MemberIdList 的 .ToList()。我不想用 ToList() 创建一个新列表,而是想将每个 r.Field 字符串添加到单元对象内的不可变列表中。

我该怎么做?

var groupedCollection = table.AsEnumerable()
        .GroupBy(row => new
        {
            UType = row.Field<string>("UnitType"),
            UZoom = row.Field<string>("UnitZoom"),
            MZoom = row.Field<string>("MemberZoom"),
        });

    var unitCollection = groupedCollection
        .Select(g => new Unit
        {
            UnitType = g.Key.UType,
            UnitZoom = g.Key.UZoom,
            MemberZoom = g.Key.MZoom,
            MemberIdList = g.Select(r => r.Field<string>("TestId")).ToList(),
        });

    List<Unit> units = unitCollection.ToList();


public class Unit
{
    public Unit()
    {
        MemberIdList = new List<String>();
    }

    public String UnitType { get; set; }
    public String UnitZoom { get; set; }
    public String MemberZoom { get; set; }
    public int MemberOrder { get; set; }

    public List<String> MemberIdList { get; private set; }
}

【问题讨论】:

  • 在我的上下文中 MemberIdList.AddRange(g.Select(r => r.Field("TestId")));不起作用。键入 MemberIdList。没有 AddRange。
  • @msfanboy 你确定那是List&lt;T&gt; 吗?因为那肯定有 AddRange。您当然需要告诉它实例,即Obj.MemberIdList.AddRange()
  • 顺便说一句; List&lt;T&gt; 绝不是一成不变的。没有 setter 的列表属性与不可变列表非常不同。
  • 但我有私人二传手??
  • @msfanboy 这样吗?这只是意味着您不能将其更改为 不同 列表。我仍然可以调用 yourList.Add(x) - list 在内部不是不可变的。

标签: c# list select extension-methods immutability


【解决方案1】:

为什么不为 Unit 创建一个构造函数来获取 MemberIdList 的数据,例如:

public Unit(IEnumerable<string> memberIdList)
{
    MemberIdList = new List<string>(memberIdList);
}

并将您的选择修改为:

.Select(g => new Unit(g.Select(r => r.Field<string>("TestId")))
{
    UnitType = g.Key.UType,
    UnitZoom = g.Key.UZoom,
    MemberZoom = g.Key.MZoom
});

【讨论】:

    猜你喜欢
    • 2019-10-13
    • 1970-01-01
    • 2012-06-22
    • 2020-06-07
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    相关资源
    最近更新 更多