C # разделить список на два списка с помощью функции bool - PullRequest
2 голосов
/ 13 июня 2019

Допустим, у меня есть List<string> listOfStrings, и я хочу разделить этот список на два списка на основе некоторого предиката.Например, первый список должен содержать все строки, которые начинаются с буквы, а второй - список строк, которые не имеют.

Теперь я бы сделал это следующим образом:

var firstList = listOfStrings.Where(str => predicate(str));
var secondList = listOfStrings.Where(str => !predicate(str));

Есть ли лучший способ сделать это в одну строку?

Ответы [ 3 ]

7 голосов
/ 13 июня 2019

Вы можете использовать Linq's GroupBy():

var splitted = listOfStrings.GroupBy(s => Char.IsLetter(s[0]));

А с вашим predicate это будет:

Func<string, bool> predicate;

var splitted = listOfStrings.GroupBy(predicate);

Использование:

Самый простой способ - преобразовать сгруппированные данные в Dictionary<bool, IEnumerable<string>>, когда ключом является bool, обозначающим, начинаются ли элементы в нем с буквы:

var splitted = list.GroupBy(x => Char.IsLetter(x[0]))
                   .ToDictionary(x => x.Key, z => z.ToArray());  

var startWithLetter = splitted[true];
var dontStartWithLetter = splitted[false];

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

См. MSDN

1 голос
/ 13 июня 2019

Вы можете использовать «GroupBy» или «ToLookup», в зависимости от того, что вы будете делать с результатами. Проверьте также lookup vs. groupby

0 голосов
/ 13 июня 2019

Я бы сделал что-то вроде этого:

class Program
{
    static void Main(string[] args)
    {
        Func<string, bool> startsWithA = s => s[0] == 'a';

        List<string> listOfStrings = new List<string>()
        {
            "abc",
            "acb",
            "bac",
            "bca",
            "cab",
            "cba"
        };

        Dictionary<bool, List<string>> dictionaryOfListsOfStrings = listOfStrings.GroupBy(startsWithA).ToDictionary(x => x.Key, x => x.ToList());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...