如何将类型 int[] 转换为 int?[]
How to convert type int[] to int?[]
我正在使用 linq 查询来输出一个 int 数组。但是我需要将它传递给一个只接受 int?[] 的方法。
所以在搜索了将 int[] 转换为 int 的方法之后?[] 我发现了一些似乎可行的方法
以下代码是一个简化示例,显示了哪些有效,哪些无效。
using System;
using System.Collections.Generic;
using System.Web;
using System.Linq;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
// working...
int[] vids1 = new[] { "", "1", "2", "3" }
.Where(x => !String.IsNullOrWhiteSpace(x))
.Select(x => Convert.ToInt32(x))
.ToArray();
foreach(int i in vids1)
{
System.Diagnostics.Debug.WriteLine(i.ToString());
}
// not working...
int?[] vids2 = new[] { "", "1", "2", "3" }
.Where(x => !String.IsNullOrWhiteSpace(x))
.Select(x => Convert.ToInt32(x))
.ToArrayOrNull();
}
}
public static class IEnumerableExtensions
{
public static T?[] ToArrayOrNull<T>(this IEnumerable<T> seq)
{
var result = seq.ToArray();
if (result.Length == 0)
return null;
return result;
}
}
}
我试过这个扩展方法,试图让它传回 int?[] 类型,但到目前为止还没有成功。
如何让我的 IEnumerable 扩展 ToArrayOrNull
传回可为 null 的类型?
int?[]
是int?
的数组。您只需要将 Select
中的 lambda 更改为 return 和 int?
:
int?[] vids2 = new[] { "", "1", "2", "3" }
.Where(x => !String.IsNullOrWhiteSpace(x))
.Select(x => (int?)Convert.ToInt32(x))
.ToArray();
如果您已经有一个 int[]
,您可以使用 Cast()
将元素转换为 int?
int[] ints = { 1, 2, 3 };
int?[] nullableInts = ints.Cast<int?>().ToArray();
不要先做错事,事后再改正。直接做正确的事。你知道你需要 int?[]
。所以创建一个int?[]
。不要先创建 int[]
然后再修复它。你可以让它工作,但它太复杂了。
int?[] vids1 = new[] { "", "1", "2", "3" }
.Where(x => !String.IsNullOrWhiteSpace(x))
.Select(x => (int?) Convert.ToInt32(x))
.ToArray();
我强烈建议甚至不要尝试使您的 ToArrayOrNull
工作的原因还在于它甚至没有接近完成您所说的应该做的事情。你可以让它工作,但你必须在开始编码之前了解应该发生什么。只要你不需要它就暂时保留它,当你稍后回头看时你可能会突然看到它。
如何使用 Cast<>
和类型约束使 T
成为 struct
:
public static IEnumerable<T?> ToArrayOrNull<T>(this IEnumerable<T> seq)
where T : struct
{
if (seq.Count() == 0)
return null;
return seq.Cast<T?>().ToArray();
}
此扩展方法 ToArrayOrNull
不会更改内容的类型。 seq
是 T
的 IEnumerable
。 result
是 T
的数组(您有时 return 是 null
,但它仍然是 T
.
的数组
如果你真的想将一个 IEnumerable<T>
转换为一个 IEnumerable<T?>
(或一个 T?
的数组),你应该对类型参数施加一些限制(它应该是 struct
,表示值类型,不能为空),并转换每个项目而不是整个结果,例如:
public static T?[] ToArrayOfNullable<T>(this IEnumerable<T> seq)
where T : struct
{
return seq.Select(val => (T?)val).ToArray();
}
尽管我会在此处 return 一个 IEnumerable<T?>
并稍后转换为数组,以保持此方法简单。
我知道这不是您问题的正确答案,但有一些不同的解决方案 - 如果您想保持顺序和 collection 长度。
public static class EnumerableExtensions
{
public delegate bool ParseDelegate<T>(string input, out T value) where T : struct;
public static T?[] ToNullable<T>(this string[] values, ParseDelegate<T> parseMethod) where T : struct
{
IEnumerable<T?> cos = values.Select(s =>
{
T result;
if (parseMethod(s, out result))
{
return (T?)result;
}
return null;
});
return cos.ToArray();
}
}
用法:
var cos = new[] { "1", "", "3", "True" };
int?[] eee= cos.ToNullable<int>(int.TryParse); // 1, null, 3, null
float?[] ada = cos.ToNullable<float>(float.TryParse); // 1, null, 3, null
bool?[] asd3 = cos.ToNullable<bool>(bool.TryParse); // null, null, null, true
我正在使用 linq 查询来输出一个 int 数组。但是我需要将它传递给一个只接受 int?[] 的方法。
所以在搜索了将 int[] 转换为 int 的方法之后?[] 我发现了一些似乎可行的方法
以下代码是一个简化示例,显示了哪些有效,哪些无效。
using System;
using System.Collections.Generic;
using System.Web;
using System.Linq;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
// working...
int[] vids1 = new[] { "", "1", "2", "3" }
.Where(x => !String.IsNullOrWhiteSpace(x))
.Select(x => Convert.ToInt32(x))
.ToArray();
foreach(int i in vids1)
{
System.Diagnostics.Debug.WriteLine(i.ToString());
}
// not working...
int?[] vids2 = new[] { "", "1", "2", "3" }
.Where(x => !String.IsNullOrWhiteSpace(x))
.Select(x => Convert.ToInt32(x))
.ToArrayOrNull();
}
}
public static class IEnumerableExtensions
{
public static T?[] ToArrayOrNull<T>(this IEnumerable<T> seq)
{
var result = seq.ToArray();
if (result.Length == 0)
return null;
return result;
}
}
}
我试过这个扩展方法,试图让它传回 int?[] 类型,但到目前为止还没有成功。
如何让我的 IEnumerable 扩展 ToArrayOrNull
传回可为 null 的类型?
int?[]
是int?
的数组。您只需要将 Select
中的 lambda 更改为 return 和 int?
:
int?[] vids2 = new[] { "", "1", "2", "3" }
.Where(x => !String.IsNullOrWhiteSpace(x))
.Select(x => (int?)Convert.ToInt32(x))
.ToArray();
如果您已经有一个 int[]
,您可以使用 Cast()
将元素转换为 int?
int[] ints = { 1, 2, 3 };
int?[] nullableInts = ints.Cast<int?>().ToArray();
不要先做错事,事后再改正。直接做正确的事。你知道你需要 int?[]
。所以创建一个int?[]
。不要先创建 int[]
然后再修复它。你可以让它工作,但它太复杂了。
int?[] vids1 = new[] { "", "1", "2", "3" }
.Where(x => !String.IsNullOrWhiteSpace(x))
.Select(x => (int?) Convert.ToInt32(x))
.ToArray();
我强烈建议甚至不要尝试使您的 ToArrayOrNull
工作的原因还在于它甚至没有接近完成您所说的应该做的事情。你可以让它工作,但你必须在开始编码之前了解应该发生什么。只要你不需要它就暂时保留它,当你稍后回头看时你可能会突然看到它。
如何使用 Cast<>
和类型约束使 T
成为 struct
:
public static IEnumerable<T?> ToArrayOrNull<T>(this IEnumerable<T> seq)
where T : struct
{
if (seq.Count() == 0)
return null;
return seq.Cast<T?>().ToArray();
}
此扩展方法 ToArrayOrNull
不会更改内容的类型。 seq
是 T
的 IEnumerable
。 result
是 T
的数组(您有时 return 是 null
,但它仍然是 T
.
如果你真的想将一个 IEnumerable<T>
转换为一个 IEnumerable<T?>
(或一个 T?
的数组),你应该对类型参数施加一些限制(它应该是 struct
,表示值类型,不能为空),并转换每个项目而不是整个结果,例如:
public static T?[] ToArrayOfNullable<T>(this IEnumerable<T> seq)
where T : struct
{
return seq.Select(val => (T?)val).ToArray();
}
尽管我会在此处 return 一个 IEnumerable<T?>
并稍后转换为数组,以保持此方法简单。
我知道这不是您问题的正确答案,但有一些不同的解决方案 - 如果您想保持顺序和 collection 长度。
public static class EnumerableExtensions
{
public delegate bool ParseDelegate<T>(string input, out T value) where T : struct;
public static T?[] ToNullable<T>(this string[] values, ParseDelegate<T> parseMethod) where T : struct
{
IEnumerable<T?> cos = values.Select(s =>
{
T result;
if (parseMethod(s, out result))
{
return (T?)result;
}
return null;
});
return cos.ToArray();
}
}
用法:
var cos = new[] { "1", "", "3", "True" };
int?[] eee= cos.ToNullable<int>(int.TryParse); // 1, null, 3, null
float?[] ada = cos.ToNullable<float>(float.TryParse); // 1, null, 3, null
bool?[] asd3 = cos.ToNullable<bool>(bool.TryParse); // null, null, null, true