将对象列表转换为元组列表而不迭代

本文关键字:列表 元组 迭代 对象 转换 | 更新日期: 2023-09-27 18:30:31

我正在尝试向 ef 对象列表添加一个额外的参数来跟踪处理,但我一直遇到必须显式初始化每个列表项的问题。正确的 linq 方法是什么?除了简洁之外,在这种情况下,linq 语法还有什么优点吗?

List<app_subjects> subjectList = AppMySQLQueries.GetAllSubjects();
List<Tuple<app_subjects, bool>> subjectCollection = new List<Tuple<app_subjects, bool>>(subjectList.Count);
foreach (app_subjects subject in subjectList)
{
     subjectCollection.Add(Tuple.Create(subject, false));
}

我已经搜索了该网站但没有成功。

将对象列表转换为元组列表而不迭代

您只想在此处使用投影(Select),它将lambda表达式中的转换应用于源集合中的每个元素。

List<Tuple<app_subjects, bool>> tuples = subjectList.Select(x => new Tuple<app_subjects, bool>(x, false)).ToList();

ToList()调用不是完全必要的,如果将其删除,则该方法将返回IEnumerable<Tuple<app_subjects, bool>>。如果你只是要迭代元组的集合,那么ToList调用应该被删除,因为它强制执行(枚举IEnumberable),然后你的下一个操作(foreach)也会做同样的事情,使代码性能变差。

像这样?

subjectList.Select(s => Tuple.Create(s, false)).ToList();

使用 C# 10.0 (.NET 6.0),这更加简单和干净。除了命名元组,我们还可以通过简单地将值放在圆括号中来声明元组。

List<(string NamedProperty1, int NamedProperty2)> _tuples = new();
_tuples = _objectList.Select(o => (o.SomeProperty1, o.SomeProperty2)).ToList();

试试这个。

List<Tuple<app_subjects, bool>> subjectCollection = subjectList.CovertAll( subject => new Tuple<app_subjects, bool>(){
subject,
false
}).ToList();