无法处理泛型中的IEnumerable <int?>

时间:2017-02-15 16:58:07

标签: c# .net generics nullable

我有一种方法来连接int?提供的字符串。

public string ConcatenateNumber(IEnumerable<int?> myList)
{
    return myList
        .Distinct()
        .Aggregate(
            new StringBuilder(), 
            (current, next) => current.Append("'").Append(next))
        .ToString()
        .Substring(1);
}

现在我想进行单元测试。

[TestMethod]
public void InputIntegers_Should_Be_Concatenated_When_Consider_Distinct()
{
    var myList = CreateEnumerable(1, 2, 2, 3);
    var logic = new MainLogic();
    var result = logic.ConcatenateNumber(myList);
    Assert.AreEqual("1'2'3", result);
}

public IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
    if (items == null)
        yield break;

    foreach (T mitem in items)
        yield return mitem;
}

但是我有编译错误。

  

C#:未知方法ConcatenateNumber(System.Collections.Generic.IEnumerable)....

我认为它是由可为空的整数int?引起的。但我不确定如何解决它。

2 个答案:

答案 0 :(得分:2)

将该类型显式传递为可为空的int。

var myList = CreateEnumerable<int?>(1, 2, 2, 3);

For example

using System;
using System.Linq;              
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var p = new Program();

        var list = p.CreateEnumerable<int?>(1, 2, 3, 4);
        p.DoWork(list);         
    }

    public void DoWork(IEnumerable<int?> enumerable)
    {
        enumerable.ToList().ForEach(x => 
        {
            Console.WriteLine(x);
        });
    }

    public IEnumerable<T> CreateEnumerable<T>(params T[] items)
    {
        if (items == null)
            yield break;

        foreach (T mitem in items)
            yield return mitem;
    }
}

答案 1 :(得分:2)

public void InputIntegers_Should_Be_Concatenated_When_Consider_Distinct()
{
    var myList = CreateEnumerable(1, 2, 2, 3);
    var logic = new MainLogic();
    var result = logic.ConcatenateNumber(myList);
}

public IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
    return items ?? Enumerable.Empty<T>();
}

public class MainLogic
{

    public string ConcatenateNumber<T>(IEnumerable<T> myList)
    {
        // do this if you want to remove nulls
        return string.Join("'", myList.Where(i => i != null).Distinct()); 

        //return string.Join("'", myList.Distinct()); // otherwise do this
    }
}