如何使用linq将对象属性转换为列表?

ddrv8njm  于 2022-12-20  发布在  其他
关注(0)|答案(4)|浏览(176)

假设有一个pair模型,它有一个FirstId和一个SecondId Guid属性,我想创建一个id列表,现在我是这样做的:

var ids = new List<Guid> { };

payload.Pairs
    .ToList()
    .ForEach(x =>
    {
        ids.Add(x.FirstId);
        ids.Add(x.SecondId);
    });

在linq中有没有什么神奇的方法可以代替ForEach来做这件事?

4ioopgfo

4ioopgfo1#

使用SelectMany

ids = payload.Pairs.SelectMany(p => new[]{ p.FirstId, p.SecondId }).ToList();
ars1skjm

ars1skjm2#

您的方法可以转换为Linq的Aggregate函数

var ids = payload.Pairs.Aggregate(
    seed: new List<Guid>(),
    func: (agg, item) => {
        agg.AddRange(new[] { item.FirstId, item.SecondId });
        return agg;
    },
    resultSelector: agg => agg);

如果您的payload.Pairs已经被具体化,并且它不是IEnumerable,那么您可以像这样进行一些内存优化

var ids = payload.Pairs.Aggregate(
    seed: new List<Guid>(payload.Pairs.Count * 2),
    func: (agg, item) => {
        agg.Add(item.FirstId);
        agg.Add(item.SecondId);
        return agg;
    },
    resultSelector: agg => agg);

Here is a working example on dotnet fiddle.

a5g8bdjr

a5g8bdjr3#

另一种类型的解决方案可以是使用两个guid流

var firstIds = payload.Pairs.Select(item => item.FirstId);
var secondIds = payload.Pairs.Select(item => item.SecondId);

然后根据顺序的重要性,您可以分别使用ZipConcat

firstIds.Concat(secondIds);
//OR
firstIds.Zip(secondIds, (f, s) => new[] { f, s }).SelectMany(x => x);

Related dotnet fiddle

aij0ehis

aij0ehis4#

除了SelectMany之外,如果你想把它们添加到一个现有的列表中,AddRange函数是最好的用途:

ids.AddRange(payload.Pairs.SelectMany(p => new[] { p.FirstId, p.SecondId }));

相关问题