LINQ列表初始化程序未保持初始化的顺序

本文关键字:初始化 顺序 列表 程序 LINQ | 更新日期: 2023-09-27 18:21:10

我有以下问题:我从数据库中选择数据,并为表中的每个项目创建一个模型。该模型包含一个列表,其中包含3种语言的名称。但由于某些原因,LINQ没有保持我的列表初始化顺序。

代码:

db.SA_BamaType
            .Select(b => new BamaTypeModel()
            {
                id = b.p_bamatype,
                bamatypeNames = new List<string>()
                {b.bamatypeafdrukNL, b.bamatypeafdrukFR, b.bamatypeafdrukEN}
            }).ToList();

但当我调试这个列表时,我看到项目是从位置随机切换的。EN将变为索引0,而NL应为索引0。

字典是最好的用途,但LINQ似乎无法翻译字典,这就是我使用List的原因。

LINQ列表初始化程序未保持初始化的顺序

但LINQ似乎不会翻译字典

当然可以:

db.SA_BamaType
            .AsEnumerable()
            .Select(b => new BamaTypeModel()
            {
                id = b.p_bamatype,
                bamatypeNames = new Dictionary<string, string>
                {
                    { "NL", b.bamatypeafdrukNL },
                    { "FR", b.bamatypeafdrukFR },
                    { "EN", b.bamatypeafdrukEN }
                }
            }).ToList();
var items = db.SA_BamaType
        .Select(b => 
        {
            id = b.p_bamatype,
            NL =  b.bamatypeafdrukNL,
            EN =  b.bamatypeafdrukEN,
            FR =  b.bamatypeafdrukFR
        }).ToList();
var models = items.Select(b=>
    new BamaTypeModel()
    { 
        id = b.id,
        bamatypeNames = new List<string>()
            {b.NL, b.FR, b.EN} 
    }
).ToList();

小提示:new List(){..,..}不是LINQ2SQL可以转换为SQL语句的构造,因此不能在LINQ查询中使用它。如果它对您有效,那么您可能已经将查询转换为对象了(正如您在调用AsEnumerable()时注意到的那样)。
new List(){"A","B"}等价于:

var list = new List<string>();
list.Add("A");
list.Add("B");

因此,它应该保持声明顺序("A"应该在0位置,"B"应该在1位置)。