2015-12-07 168 views
0

我正在使用linq查询来输出int数组。但我需要将它传递给只接受int?[]的方法。如何将int []类型转换为int?[]

所以就如何INT []转换后搜索到int?[]我发现了一些似乎可能工作here

下面的代码是一个简单的例子,显示什么是工作和不工作。

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回传可空类型?

+0

你似乎是混合经过可空INT的数组与返回一个空数组。你想达到什么目的?? – Scottie

+0

@PoweredByOrange'其中T:struct'完成这项工作。 – DavidG

回答

1

不要做首先是错误的,然后再修复它。做正确的事情。你知道你需要一个int?[]。所以创建一个int?[]。不要先创建int[]然后修复它。你可以使它工作,但它毫无意义的复杂。

int?[] vids1 = new[] { "", "1", "2", "3" } 
    .Where(x => !String.IsNullOrWhiteSpace(x)) 
    .Select(x => (int?) Convert.ToInt32(x)) 
    .ToArray(); 

的原因,我强烈暗示甚至没有试图让你的ToArrayOrNull工作也是因为它甚至没有接近做你说应该怎么做。你可以使它工作,但你必须明白开始编码之前应该怎么做。只要你不需要它,现在就离开它,当你回头看时,你可能会突然看到它。

+0

我知道我在眺望什么。谢谢你让我挺直。 – ooXei1sh

+1

@ ooXei1sh感谢编辑建议。我把最后一句话写进去了,因为当我没有阅读时重新阅读我的回答时,我觉得我碰到了一个屁股。 :)我很高兴你明白我的意思。 – hvd

2

int?[]int?的数组。所有你需要的是改变拉姆达在Select,返回一个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(); 
1

这样如何使用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(); 
} 
2

这个扩展方法,ToArrayOrNull,不改变内容的类型。 seqTIEnumerableresultT(你有时会返回为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(); 
    } 

虽然我会回到这里的IEnumerable<T?>和稍后转换为数组,k这个方法简单。

+0

@ M.kazemAkhgary,你是对的,我会改变这一点。 – joranvar

1

我知道这不是你的问题的正确答案,但有一点不同的解决方案 - 如果你想保持秩序和收集长度。

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 
相关问题