Попытка преобразовать список в массив приводит к «ошибке CS1503: Аргумент 1: невозможно преобразовать из« System.Collections.Generi c .List <int>»в« System.Array »» - PullRequest
0 голосов
/ 25 февраля 2020

Я новичок в C#, исходящем из python фона. В настоящее время я пытаюсь решить эту проблему на codewars.com. Речь идет о поиске всех делителей на число. Я попытался запрограммировать его следующим образом, который уже является улучшенной версией моего кода в этом вопросе

using System;
using System.Collections.Generic;

public class Kata
{  
  public static int[] Divisors(int n)
  {
    List<int> divisors = new List<int>();

    int i = 2, biggest_divisor = n;

    while (true)
    {
      if ( n % i == 0)
        {
          divisors.Add(i);
          divisors.Add(n/i);
          biggest_divisor = i;
        }

      if ( i > biggest_divisor)
        break;

      i++;
    }

    if (divisors.Count > 0)
    {
      divisors.ToArray();
      return Array.Sort(divisors);
    }
    else
      return null;
  }
}

При выполнении if (divisors.Count > 0) это приводит к следующей ошибке

ошибка CS1503: аргумент 1: невозможно преобразовать из 'System.Collections.Generi c .List' в 'System.Array'

Почему эта ошибка появляется в любом случае, я ' м, просто используя методы в списке.

Ответы [ 3 ]

3 голосов
/ 25 февраля 2020

Ну,

  divisors.ToArray(); 

создает новый int[] массив и выбрасывает его . Затем вы пытаетесь отсортировать список divisors (List<int>) как массив :

  // divisors is List<int>, not expected int[] 
  return Array.Sort(divisors);

и иметь ошибку времени компиляции . Давайте разберем divisors и вернем его как массив за один go:

using System.Linq;

...

public static int[] Divisors(int n)
  {
    ...
    if (divisors.Count > 0)
    {
      // Order List, create an array from it and, finally, return the array
      return divisors.OrderBy(item => item).ToArray();
    }
    else
      //TODO: better return an empty array: return int[0]; 
      return null;
  }
2 голосов
/ 25 февраля 2020

pass divisors.ToArray(); to Array.Sort(HERE); он ожидает, что Array не List<T>

divisors.ToArray() не мутирует divisors, он возвращает копию списка, преобразованную в Array структура вместо.

Итак:

if (divisors.Count > 0)
{
  divisors.ToArray();
  return Array.Sort(divisors);
}

Должно быть

if (divisors.Count > 0)
{
  var divisorsArray = divisors.ToArray();
  Array.Sort(divisorsArray);
  return divisorsArray;
}

И ошибка должна исчезнуть

Кстати, используйте do-while вместо while (true) и перерыва.

1 голос
/ 25 февраля 2020

Проблема в том, что метод ToArray () возвращает массив, а не преобразует объект в массив.

Чтобы решить эту проблему, необходимо сделать следующее:

    if (divisors.Count > 0)
    {
      var divs = divisors.OrderBy().ToArray();
      return divs;
    }
...