Linq, потоковое и сбор - PullRequest
       4

Linq, потоковое и сбор

0 голосов
/ 23 декабря 2011

У меня есть этот метод, который возвращает массив строк:

    private static string[] ReturnsStringArray()
    {
        return new string[]
        {
            "The path of the ",
            "righteous man is beset on all sides",
            "by the inequities of the selfish and",
            "the tyranny of evil men. Blessed is",
            "he who, in the name of charity and",
            "good will, shepherds the weak through",
            "the valley of darkness, for he is",
            "truly his brother's keeper and the",
            "finder of lost children. And I will ",
            "strike down upon thee with great",
            "vengeance and furious anger those",
            "who attempt to poison and destroy my",
            "brothers. And you will know my name",
            "is the Lord when I lay my vengeance", 
            "upon you"
        };
    }
}

Я хочу написать метод, который использует этот метод. Поскольку этот метод возвращает массив, а не IEnumerable, существует ли тот же результат, чтобы написать это:

    private static IEnumerable<string> ParseStringArray()
    {
        return ReturnsStringArray()
            .Where(s => s.StartsWith("r"))
            .Select(c => c.ToUpper());
    }

и это:

    private static List<string> ParseStringArray()
    {
        return ReturnsStringArray()
            .Where(s => s.StartsWith("r"))
            .Select(c => c.ToUpper())
            .ToList(); // return a list instead of an IEnumerable.
    }

Спасибо.

EDIT

У меня такой вопрос: есть ли какой-либо интерес или преимущество в том, что метод ParseStringArray () возвращает IEnumerable вместо List, потому что этот метод вызывает ReturnsStringArray, который возвращает массив строк, а не IEnumerable

Ответы [ 3 ]

3 голосов
/ 23 декабря 2011

Когда вы возвращаете List, вы говорите, что «вся обработка завершена, а список содержит результаты».

Однако, когда вы возвращаете IEnumerable, вы говорите, что «обработка, возможно, все еще должна быть выполнена».

В вашем примере, когда вы возвращаете IEnumerable, .Where и .Select НЕ обрабатывались. Это известно как «отложенное выполнение».
Если пользователь использует результат 3 раза, то .Where и .Select будут выполняться 3 раза. Это может привести к множеству хитрых проблем.

Я рекомендую использовать List как можно чаще при возврате значений из метода. В дополнение к дополнительным функциям, которые вы получаете от List, .NET имеет много оптимизаций, для которых требуется List, улучшена поддержка отладки и уменьшен шанс непреднамеренных побочных эффектов!

0 голосов
/ 23 декабря 2011

Я бы лично порекомендовал вернуть string[], так как вы вряд ли захотите добавить к результатам (исключая List<string>), но похоже, что вам может потребоваться последовательный доступ (для которого IEnumerable<string> не предназначен). Откладываете ли вы выполнение или нет, зависит от вас и ситуации; если результат используется много раз, может быть целесообразно позвонить ToArray() перед возвратом результатов.

private static string[] ParseStringArray()
{
    return ReturnsStringArray()
        .Where(s => s.StartsWith("r"))
        .Select(c => c.ToUpper())
        .ToArray();
}
0 голосов
/ 23 декабря 2011

Список - это конкретная реализация IEnumerable.Разница в том, что

1) IEnumerable - это просто последовательность строк, но List индексируется по индексу int, его можно добавлять и удалять, а также вставлять элементы по определенному индексу.

2) Элемент может быть повторен по последовательности, но не допускает произвольного доступа.Список - это конкретная коллекция произвольного доступа с переменным размером.

...