У меня есть задача: реализовать метод FilterByDigit, который получает массив целых чисел, элементы которого содержат заданную цифру. Не используйте LINQ. Постановка задачи дается в XML-комментариях к этому методу.
Например, для массива {1, 2, 3, 4, 5, 6, 7, 68, 69, 70, 15, 17} => {7, 70, 17} для цифры = 7.
Может быть, я могу использовать Array.FindAll?
Моя собственная идея - использовать цикл и подсчитывать такие элементы, а затем изменять размер массива.
namespace FilterTask
{
public static class ArrayExtension
{
public static bool IsContainDigit(int element, int digit)
{
if (element == 0 && digit == 0)
{
return true;
}
element = Math.Abs(element);
while (element != 0)
{
if (digit == element % 10)
{
return true;
}
element /= 10;
}
return false;
}
public static int[] FilterByDigit(int[]? source, int digit)
{
if (source == null)
{
throw new ArgumentNullException(nameof(source));
}
if (source.Length == 0)
{
throw new ArgumentException("Invalid size");
}
if (digit < 0 || digit > 9)
{
throw new ArgumentOutOfRangeException(nameof(digit));
}
int count = 0;
for (int i = 0; i < source.Length; ++i)
{
if (IsContainDigit(source[i], digit))
{
++count;
}
}
int[] answer = new int[count];
int j = 0;
for (int i = 0; i < source.Length; ++i)
{
if (IsContainDigit(source[i], digit))
{
answer[j++] = source[i];
}
}
return answer;
}
}
}
Почему я могу использовать Array.FindAll?" - не следил за вопросом. Array.FindAll не является частью LINQ, и вы можете использовать его, если хотите.
Добро пожаловать в Stack Overflow! Пожалуйста, опубликуйте свой код и покажите нам, что вы уже пробовали. Также ознакомьтесь со следующими рекомендациями о том, как задать хороший вопрос: stackoverflow.com/help/how-to-ask
Могу ли я упростить свой код, может быть, вы можете сказать мне, как я могу использовать Array.Findl?
Любое оправдание для «Не используйте LINQ»? Интересно, является ли ограничение «Не использовать LINQ» произвольным ограничением, например, для школьного задания, которое явно исключает использование любой предварительно созданной функции поиска/фильтрации, такой как Array.FindAll?





Могу ли я упростить свой код, может быть, вы можете сказать мне, как я могу использовать Array.FindAll?
Вот, пожалуйста. Array.FindAll принимает предикат поиска и возвращает массив совпадающих элементов.
var ints = new[] { 1, 2, 3, 4, 5, 6, 7, 68, 69, 70, 15, 17 };
var findAll = Array.FindAll(ints, i1 => i1.ToString().Contains("7"));
Также вы можете проверить, как это реализовано @source.dot.net.
P.S.
Ваш подход тоже кажется правильным (просто убедитесь, что он работает по назначению).
Вы также можете использовать Array.FindAll с существующей функцией.
var found = Array.FindAll(i => IsContainDigit(i, someDigit));
После подсчета элементов вы можете создать новый массив соответствующего размера и заполнить его отфильтрованными элементами.
{
public static class ArrayExtension
{
public static bool IsContainDigit(int element, int digit)
{
if (element == 0 && digit == 0)
{
return true;
}
element = Math.Abs(element);
while (element != 0)
{
if (digit == element % 10)
{
return true;
}
element /= 10;
}
return false;
}
public static int[] FilterByDigit(int[] source, int digit)
{
if (source == null)
{
throw new ArgumentNullException(nameof(source));
}
if (source.Length == 0)
{
throw new ArgumentException("Invalid size");
}
if (digit < 0 || digit > 9)
{
throw new ArgumentOutOfRangeException(nameof(digit));
}
int count = 0;
for (int i = 0; i < source.Length; ++i)
{
if (IsContainDigit(source[i], digit))
{
++count;
}
}
int[] answer = new int[count];
int j = 0;
for (int i = 0; i < source.Length; ++i)
{
if (IsContainDigit(source[i], digit))
{
answer[j++] = source[i];
}
}
return answer;
}
}
}
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 68, 69, 70, 15, 17 };
int digit = 7;
int[] filteredNumbers = ArrayExtension.FilterByDigit(numbers, digit);
Console.WriteLine(string.Join(", ", filteredNumbers)); // Output: 7, 70, 17
Не могли бы вы поделиться кодом и объяснить, что у вас не работает.