Наиболее эффективно передать коллекцию Char в метод для населения - PullRequest
3 голосов
/ 24 апреля 2010

Это лучший способ получить коллекцию символов? Хотите ли вы использовать List для примитивов, таких как char, излишне?

private void GetChars(ref List<char> charsToPopulate)  
{  
    foreach(Thing t in Things)  
    {  
       charsToPopulate.Add(t.CharSymbol);  
    }  
}  

Ответы [ 3 ]

3 голосов
/ 24 апреля 2010

Использование ленивой последовательности даст вам большую гибкость в том, как вы можете работать с персонажами. Вы действительно должны изменить метод на что-то вроде этого.

private IEnumerable<char> GetChars(IEnumerable<Thing> things)
{
    return things.Select(thing => thing.CharSymbol);
}

Таким образом, они могут обернуть его в любую коллекцию, какую захотят:

var list = GetChars(Things).ToList();
var array = GetChars(Things).ToArray();

Или удалите метод все вместе:

var chars = Things.Select(thing => thing.CharSymbol).ToList();
1 голос
/ 24 апреля 2010

Самый эффективный способ - получить предварительно выделенный массив символов, в который вы будете записывать элементы. Конечно, для этого необходимо заранее знать размер.

Вторым наиболее эффективным будет выделение массива в методе, а затем его заполнение. Это все еще требует некоторой способности быстро вычислить размер Things, но, по крайней мере, скрывает его от вызывающей стороны.

Если нет способа узнать размер заранее (например, Things - это достаточно большая отложенная последовательность, чтобы кэшировать ее было невозможно), то ваше решение, вероятно, будет таким же хорошим, как и оно.

1 голос
/ 24 апреля 2010

Вы хотите передать ссылку на список по значению, а не по ссылке:

private void GetChars(List<char> charsToPopulate)  

Кроме того, ваш код в порядке. Использование списков для примитивных типов, таких как char, очень распространено.


Если вы заинтересованы в написании той же реализации, немного отличающейся, вы можете использовать LINQ, чтобы заполнить список из вещей:

{
    charsToPopulate.AddRange(from t in things select t.CharSymbol);
}

Кстати, нет ничего плохого в создании списка в методе. Вам не нужно «распределять» список перед передачей его методу:

private List<char> GetChars()
{
    List<char> charsToPopulate = new List<char>();
    foreach(Thing t in Things)  
    {  
       charsToPopulate.Add(t.CharSymbol);  
    }  
    return charsToPopulate;
}

или используя LINQ:

private List<char> GetChars()
{
    return things.Select(t => t.CharSymbol)
                 .ToList();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...