C# 对列表中的每个对象调用方法,或者将对象列表传递给方法并返回新列表?

C# 对列表中的每个对象调用方法,或者将对象列表传递给方法并返回新列表?,c#,list,C#,List,这可能是一个过于笼统的问题,所以让我补充一些细节: 我有一个实体对象列表,需要使用AutoMapper将其转换为另一个对象 我已经有了一个方法,该方法将实体作为参数,并在调用AutoMapper的.Map() 我的问题是哪一个更便宜? -对列表中的每个实体调用我预先存在的方法? 使用类似于foreach或的方法。选择(x=>transformer.transform(x)) 或 -将实体列表传递给执行foreach的新方法,然后返回新列表 这有一个一般的规则吗?你的答案似乎取决于列表的用法-你是

这可能是一个过于笼统的问题,所以让我补充一些细节:

我有一个实体对象列表,需要使用AutoMapper将其转换为另一个对象

我已经有了一个方法,该方法将实体作为参数,并在调用AutoMapper的
.Map()

我的问题是哪一个更便宜?

-对列表中的每个实体调用我预先存在的方法?

使用类似于
foreach
的方法。选择(x=>transformer.transform(x))

-将实体列表传递给执行foreach的新方法,然后返回新列表


这有一个一般的规则吗?

你的答案似乎取决于列表的用法-你是要将它视为一个
IQueryable
还是
IEnumerable
list
-你需要的列表越接近一个具体的数组结构,它的成本就越高。如果您可能使用LINQ通过AutoMapper转换来减少调用次数


所以,您是否真的想从
列表
转换为
列表
,这是一个应该指导您的问题。

似乎您的答案将取决于列表的用法-您是否将其视为
IQueryable
IEnumerable
列表
-越接近具体的数组你需要列表的结构,它越昂贵。如果您可能使用LINQ通过AutoMapper转换来减少调用次数


因此,您是否真的想从
列表
转换为
列表
,这是应该在这里指导您的问题。

您列出的每种方法都会有非常低的开销。我会选择最具可读性的,IMO使用的是
Select
。否则的话,我会很生气


然而,我发现这是不太可能的,因为从DB中提取实体和自动映射比LINQ慢得多。

您列出的每种方法都会有非常低的开销。我会选择最具可读性的,IMO使用的是
Select
。否则的话,我会很生气


但是,我发现这是不太可能的,因为从DB中提取实体和自动映射与LINQ相比速度非常慢。

您不需要在要映射的列表上循环。AutoMapper能够将列表转换为其他列表。 例如如果将TSource映射到TDestination,则可以将IEnumerable转换为IEnumerable


选中此处:

您不需要在要映射的列表上循环。AutoMapper能够将列表转换为其他列表。 例如如果将TSource映射到TDestination,则可以将IEnumerable转换为IEnumerable


检查这里:

我的每日困境!“对林克还是不对林克,这是个问题!”它们同样不贵。两者都很便宜。请注意,
.Select(x=>transformer.transform(x))
也可以写入
.Select(transformer.transform)
,然后
Func
实例将直接引用
transform
方法,而不是引用匿名函数。但它同样便宜,只是在我看来更漂亮。我始终记住,调用额外的函数/方法需要额外的时间。@JeppeStigNielsen感谢您的洞察力!我每天都进退两难!“对林克还是不对林克,这是个问题!”它们同样不贵。两者都很便宜。请注意,
.Select(x=>transformer.transform(x))
也可以写入
.Select(transformer.transform)
,然后
Func
实例将直接引用
transform
方法,而不是引用匿名函数。但它同样便宜,只是在我看来更漂亮。我始终记住,调用额外的函数/方法需要额外的时间。@JeppeStigNielsen感谢您的洞察力<代码>+1用于使用已知的
计数初始化
新列表
。您也可以使用数组(为什么,您将其转换到接口
IList
,因此简单的数组就是
IList
)。欣赏这一见解<代码>+1
用于使用已知的
计数初始化
新列表
。您也可以使用数组(为什么,您将其转换到接口
IList
,因此简单的数组就是
IList
)。欣赏这一见解!谢谢你给汽车制造商的小费!谢谢你给汽车制造商的小费!
IList<NewT> newList = oldList.Select(transformer.transform).ToList();
IList<NewT> newList = new List<NewT>(oldList.Count);
for (int i = 0; i < oldList.Count; i++)
    newList[i] = transformer.transform(oldList[i]);