如何将C#中ToArray转换与数组单个元素修改合并为一行语句?
如何将C#中ToArray转换与数组单个元素修改合并为一行语句?
嘿,我来帮你捋清楚这个问题~你遇到的核心坑点是C#赋值表达式的返回值特性:x = y这样的赋值语句,返回的是右边的y值,而不是被赋值的变量x,更不是整个数组。所以你第二种写法最后返回的其实是字符串"Some text",完全不是你需要的WeatherForecast[]数组,这不就跑偏了嘛。
要把这两个操作合并成一个语句链或者一行代码,有几种靠谱的实现方式:
方式1:生成阶段直接修改目标元素(最简洁推荐)
既然你明确要修改第一个元素,不如在Select生成对象的时候就直接设置好对应的Summary,连后续的数组修改步骤都省了:
return Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), TemperatureC = Random.Shared.Next(-20, 55), Summary = index == 1 ? "Some text" : Summaries[Random.Shared.Next(Summaries.Length)] }) .ToArray();
这里利用Range(1,5)生成的第一个元素索引是1的特性,直接给它指定目标Summary值,其他元素还是随机取值,一步到位完成所有操作。
方式2:用C# 10+的with表达式(适合先生成再修改的场景)
如果你的项目用的是C# 10及以上版本,还可以用with表达式直接修改数组元素后返回数组,写法更紧凑:
return (Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)] }) .ToArray()) with { [0].Summary = "Some text" };
with表达式会创建数组的副本并修改指定位置的元素,最后返回修改后的完整数组,完美匹配你的需求。
方式3:局部变量一行搞定(兼容所有C#版本)
如果你的项目用的是旧版C#,不支持with表达式,也可以把变量声明、赋值、修改、返回揉成一行:
return (arr = Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)] }).ToArray()).Apply(a => a[0].Summary = "Some text");
这里的Apply是一个自定义扩展方法(你可以自己实现:public static T Apply<T>(this T obj, Action<T> action) { action(obj); return obj; }),如果不想写扩展方法,也可以用嵌套赋值的方式实现,不过可读性会差一些。
备注:内容来源于stack exchange,提问作者Megrez7
相关产品推荐
相关产品推荐

