gpt4 book ai didi

c# - 在空序列上使用 Enumerable.Aggregate(...) 方法

转载 作者:IT王子 更新时间:2023-10-29 04:29:04 27 4
gpt4 key购买 nike

我想使用 Enumerable.Aggregate(...) 方法连接由分号分隔的字符串列表。很简单,不是吗?

考虑以下因素:

  • private const string LISTSEPARATOR = "; ";
  • 专辑。OrderedTracksList<TrackDetails>
  • TrackDetailsDiscNumber Int16?属性(property)

如果 Distinct() 返回的序列为空(因为 Aggregate() 方法不适用于空序列),以下语句将抛出异常:

    txtDiscNumber.Text = album.OrderedTracks
.Where(a => a.DiscNumber.HasValue)
.Select(a => a.DiscNumber.Value.ToString())
.Distinct()
.Aggregate((i, j) => i + LISTSEPARATOR + j);

我正在使用的解决方法:

    List<string> DiscNumbers = 
album.OrderedTracks
.Where(a => a.DiscNumber.HasValue)
.Select(a => a.DiscNumber.Value.ToString())
.Distinct()
.ToList();

if (!DiscNumbers.Any())
txtDiscNumber.Text = null;
else
txtDiscNumber.Text =
DiscNumbers.Aggregate((i, j) => i + LISTSEPARATOR + j);

有没有更好的解决办法?是否可以在单个 LINQ 语句中执行此操作?

提前致谢。

最佳答案

要连接字符串列表,请使用 string.Join方法。

Aggregate 函数不适用于空集合。它需要一个二元累加函数,并且需要集合中的一个项目作为种子值传递给二元函数。

但是,有一个 overload of Aggregate :

public static TResult Aggregate<TSource, TAccumulate, TResult>(
this IEnumerable<TSource> source,
TAccumulate seed,
Func<TAccumulate, TSource, TAccumulate> func,
Func<TAccumulate, TResult> resultSelector
)

此重载允许您指定种子值。如果指定了种子值,如果集合为空,它也将用作结果。

编辑:如果你真的想使用Aggregate,你可以这样做:

sequence.Aggregate(string.Empty, (x, y) => x == string.Empty ? y : x + Separator + y)

或者使用 StringBuilder 这样:

sequence.Aggregate(new StringBuilder(), (sb, x) => (sb.Length == 0 ? sb : sb.Append(Separator)).Append(x)).ToString()

关于c# - 在空序列上使用 Enumerable.Aggregate(...) 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14897121/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com