如何使用LINQ更新List中所有对象的整数属性

y1aodyip  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(95)

如何使用Linq更新List中所有对象的Id属性,使其具有序列号?
预期结果为BookList,其中所有BookDetailId为1到3。

public class BookDetail
{
    public int Id { get; set; }
    public string Title { get; set; }
}

List<BookDetail> BookList = new List<BookDetail>
{
    new BookDetail{Id = 0, Title = "Aaa"},
    new BookDetail{Id = 0, Title = "Bbb"},
    new BookDetail{Id = 0, Title = "Ccc"}
};

字符串

jbose2ul

jbose2ul1#

Linq是用来查询的,不是用来更新的。如果在查询中包含item索引,你可以 * 使用linq来投影到一个 new 的新对象列表:

var newBookList = BookList.Select(
    (b, i) => new BookDetail {
        Id = i,
        Title = b.Title
    }
).ToList()

字符串
但这不仅创建了一个新的 list,还在list中创建了新的 objects,有效地使内存使用量增加了一倍。
如果你想修改列表的内容,只需使用for循环来轻松获取索引:

for(int i=0; i < BookList.Length; i++)
{
    BookList[i].Id = i;
}


可以使用ForEach *,但它不支持索引参数,因此您必须创建自己的变量并在ForEach中递增它。另外,关于ForEach与传统foreach循环的有用性存在争议(您还必须在foreach中创建索引变量)。
我很感激你想用它来“学习Linq”,但是学习如何使用工具的一部分是学习 * 什么时候不应该使用工具 *。

iugsix8n

iugsix8n2#

您可以使用All来设置每个项目的id。

var id = 1;

BookList.All(item => { item.Id = id++; return true; });

字符串
ForEach是另一个选项,但仅适用于List
如果你有一个Enumerable,不想/不需要转换成List,那么这是可用的linq方法。
至于使用forforeach循环,两者都不是linq,因此被排除在外。

相关问题