C# Преобразование из списка в IList - PullRequest
0 голосов
/ 27 марта 2020

У меня есть C# функция, подобная этой -

public IList<IList<int>> Subsets(int[] nums)
{
    List<List<int>> output = new List<List<int>>();
    if (nums.Length == 0)
    {
        return output;    //Problem in this line
        //return null;
    }
    ........
    ........
    return output.Concat(Subsets(nums.Skip(1).ToArray())).ToList();
}

То, что я нахожу, -

Severity    Code    Description Project File    Line    Suppression State

Error   CS0266
Cannot implicitly convert type 'System.Collections.Generic.List<System.Collections.Generic.List<int>>' to 'System.Collections.Generic.IList<System.Collections.Generic.IList<int>>'.

An explicit conversion exists (are you missing a cast?) LeetCode    D:\LeetCode\Solution.cs 13  Active

Error

Может кто-нибудь помочь, пожалуйста?

Ответы [ 4 ]

1 голос
/ 27 марта 2020

Попробуйте:

IList<IList<int>> list2 = list.Cast<IList<int>>().ToList();

Вы должны добавить using System.Linq; для этого.

0 голосов
/ 27 марта 2020

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

[StructLayout(LayoutKind.Explicit)]
public struct Union
{
    [FieldOffset(0)]
    public List<List<int>> a;
    [FieldOffset(0)]
    public IList<IList<int>> b;

    public static IList<IList<int>> Cast(List<List<int>> list)
    {
        var u = new Union();
        u.a = list;
        return u.b;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var lists = new List<List<int>>() { new List<int>() { 1, 2, 3 } };
        IList<IList<int>> casted = Union.Cast(lists);
    }
}
0 голосов
/ 27 марта 2020

Спасибо @ NetMage за отличный комментарий.

Я изменил

return new List<List<int>>();

на

return new List<IList<int>>();

, который прекрасно работает для я.

0 голосов
/ 27 марта 2020

Изменить

List<List<int>> output = new List<List<int>>();

на

List<IList<int>> output = new List<IList<int>>();

Вы можете привести внешний список к IList, так как List реализует IList, но вы не можете принудительно вызвать приведение аргумента типа Список, поэтому он должен быть объявлен как IList с самого начала.

...