我有这样的代码将可空数组转换为普通数组
object myCoolConvertion(object value)
{
if (value is int?[])
return Array.ConvertAll((int? [])value, x => x ?? default(int));
if (value is double?[])
return Array.ConvertAll((double?[])value, x => x ?? default(double));
if (value is float?[])
return Array.ConvertAll((float?[])value, x => x ?? default(float));
return value;
}
是否可以为以下任何类型编写通用代码
if (value is T?[])
return Array.ConvertAll((T? [])value, x => x ?? default(int));
发布于 2022-01-26 00:37:02
您可以使用泛型方法来完成这一任务,例如:
T[] Convert<T>(T?[] array) where T : struct
{
return Array.ConvertAll(array, t => t ?? default(T));
}
发布于 2022-01-26 00:44:07
Iridium的回答是:Nullable<T>
有一个名为GetValueOrDefault
的方法,它可以使您的代码更加简洁:
T[] Convert<T>(T?[] array) where T : struct
=> Array.ConvertAll(array, t => t.GetValueOrDefault());
发布于 2022-01-26 03:30:59
我宁愿过滤掉null
对象。因为默认结构是无用的,不能区分真实的对象。
我用IEnumerable.OfType()来做这个。
using System;
using System.Linq;
public class Program
{
public static T[] ConvertWithout<T>(T?[] array) where T : struct =>
array.OfType<T>().ToArray();
public struct TestStruct
{
public string Name {get;set;}
}
public static void Main()
{
var testArray = new TestStruct?[]
{
new TestStruct { Name = "Peter"},
null,
new TestStruct{Name="John"}
};
var result = ConvertWithout(testArray);
foreach(var person in result)
Console.WriteLine(person.Name);
}
}
结果:
Peter
John
https://stackoverflow.com/questions/70860519
复制相似问题