используя Func, как я могу разделить символ, а затем подсчитать длину этих значений в функции

#c#

#c#

Вопрос:

По сути, мне нужно разделить строку, как "aaaaa.bbbbbbbb.cccccc" на . а затем подсчитать длину разделенных значений с помощью функции.

 Func<string, bool> length = f => f.Split(".").Length > 1;
  

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

Комментарии:

1. Func<string, bool> этого вам не даст.

2. Вы не хотите Func<string, char, IEnumerable<int>> ?

3. @Jodrell, которая не вернет несколько значений

4. @DanielA. Белый цвет вернет последовательность целых чисел.

5. зевок, Func<string, char, IEnumerable<int>> getLengths = (input, separator) => input.Split(separator).Select(s => s.Length); или что-то в этом роде.

Ответ №1:

Если вам нужен логический ответ, то это либо одно из следующих (в зависимости от того, нужна ли вам хотя бы одна подстрока длиной > 1 или вы хотите их все:

     Func<string, bool> length1 = f => f.Split('.').Any(s => s.Length > 1);
    Func<string, bool> length2 = f => f.Split('.').All(s => s.Length > 1);
  

Ответ №2:

Я думаю, что вы пытаетесь это сделать:

 string input = "aaaaa.bbbbbbbb.cccccc";
var parts = input.Split('.');
var lengths = parts.Select(e=>e.Count());
  

Ответ №3:

Если вы имеете в виду для каждой буквы: aaaaa.bbbbbbbb.cccccc -> a = 5, b = 8, c = 6

Func<string, IEnumerable<int>> length = f => f.Split('.').Select(a => a.Length)

Ответ №4:

Насколько я понимаю, вам нужно взять строку, разделить ее только на разделитель ‘.’, а затем посчитать, чтобы увидеть, больше ли каждое разделенное значение 1.

Если это так, вы можете использовать следующее:

 Func<string, bool> length = str => str.Split('.').All(s => s.Length > 1);
  

Сначала строка будет разделена вашим разделителем, затем повторите все значения, чтобы проверить, больше ли они 1.

Быстрый тестовый пример:

 string test1 = "aaa.b.ccccccc";
string test2 = "aaaaaa.bbb.c";
string test3 = "aaa.bbb.ccccc";

Console.WriteLine(length(test1)); // false, as b is 1, not greater
Console.WriteLine(length(test2)); // false, for similar reasons
Console.WriteLine(length(test3)); // true, all are greater
  

Ответ №5:

Другой способ с использованием делегата функции:

 Func<string, Tuple<string[], int[]>> length = (str) => {
    string[] stringParts = str.Split('.');
    int[] countLetters = stringParts.Select(s => s.Length).ToArray();
    return new Tuple<string[], int[]>(stringParts, countLetters);
};

string input = "aaaaa.bbbbbbbb.cccccc";

var res = length(input);
string[] strs = res.Item1;
int[] countLetter = res.Item2;


for (int i = 0; i < strs.Length; i  )
{
    Console.WriteLine(strs[i]);
    Console.WriteLine(countLetter[i]);
}
  

Вывод:

 aaaaa
5
bbbbbbbb
8
cccccc
6
  

Возможно, метод расширения был бы более простым способом сделать это.

Ответ №6:

Как насчет того, чтобы написать метод, который возвращает список строк, превышающих указанную вами длину, что-то вроде этого:

 IEnumerable<string> GetSplittedAboveLimit(string inputString,int limit)
{
   var splitted = inputString.Split(".");
   foreach(var input in splitted)
   {
      if(input.Length > limit)
      {
          yield return input; 
      }
   }
}
  

Ответ №7:

как насчет этого [Ссылка на пример]:

 Func<string, List<int>> length = f => f.Split('.').Select(x=>x.Length).ToList();
  

И вызвать метод следующим образом:

 string inputStr = "aaaaa.bbbbbbbb.cccccc";
Console.WriteLine(String.Join(",",length(inputStr))); // prints 5,8,6
  

Пожалуйста, обратите внимание: второй параметр в Func обозначает тип возвращаемого значения, здесь, в примере, я использовал его как List<int> вот почему я добавил .ToList() в конце кода. Вы можете соответствующим образом изменить возвращаемые типы. Если вы согласны с IEnumerable<int> , то

 Func<string, IEnumerable<int>> length = f => f.Split('.').Select(x=>x.Length) 
  

достаточно.

Комментарии:

1. OP хочет подсчитать сумму в каждой записи. Это не будет вычислять длину каждого массива, только самого массива.

2. @Frontear, спасибо, что поправили меня, я только что обновил сообщение, не могли бы вы просмотреть то же самое

3. @Jodrell: спасибо, что исправили меня, я только что обновил сообщение, не могли бы вы просмотреть то же самое

4. @JohneyBronswicAppleton: добавить using System.Linq; в раздел использования

5. Почему ToList() ?