2017-02-15 26 views
2

У меня есть способ объединить строки, предоставленные int?.Невозможно иметь дело с IEnumerable <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?. Но я не уверен, как это исправить.

+1

Просто укажите тип, как это 'CreateEnumerable (1,2,2,3)'. – juharr

+4

'IEnumerable ' is not 'IEnumerable ' ... и я не думаю, что вы захотите этого '.Substring (1)' –

+0

Без подстроки (1) результат будет равен '1'2'3. Но я хочу 1'2'3. – Bigeyes

ответ

2

Явным образом передайте этот тип в виде значения NULL.

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; 
    } 
} 
+0

Не используйте '.ToList()' просто для вызова '.ForEach (...)' ... это приводит к циклическому циклу набора, не дает никаких преимуществ. –

+0

@MatthewWhited 'ForEach' не существует в' IEnumerable'. –

+0

нет ... но 'foreach (var x в перечислимом)' делает. –

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 
    } 
} 
+0

Спасибо. Вы упомянули string.Join уже использует StringBuilder. Я не могу найти источник. Вы посмотрели [disscussion] (http://stackoverflow.com/questions/585860/string-join-vs-stringbuilder-which-is-faster)? – Bigeyes

+0

@Bigeyes https://referencesource.microsoft.com/#mscorlib/system/string.cs, fa961ce440526a4d –

+0

Вы собираетесь использовать одно соединение, а не набор объединений. –

 Смежные вопросы

  • Нет связанных вопросов^_^