开发者

Writing a function using generics

开发者 https://www.devze.com 2022-12-24 10:19 出处:网络
I\'m trying to write a C# function and make it accept any type parameter. I want to do it with generic list, but for some reason I can\'t get it working. How to do it? Are there other ways?

I'm trying to write a C# function and make it accept any type parameter. I want to do it with generic list, but for some reason I can't get it working. How to do it? Are there other ways?

public class City
{
    public int Id;
    public int? ParentId;
    public string CityName;
}

public class ProductCategory
{
    public int Id;
    public int? ParentId;
    public string Category;
    public int Price;
}

public class Test
{

        public void ReSortList<T>(IEnumerable<T> sources, ref IEnumerable<T> returns, int parentId)
        {
           //how to do like this:
           /*
            var parents = from source in sources where source.ParentId == parentId && source.ParentId.HasValue select source开发者_高级运维;

            foreach (T child in parents)
            {
                returns.Add(child);
                ReSortList(sources, ref returns, child.Id);
            }
           */
        }

        public void Test()
        {
            IList<City> city = new List<City>();

            city.Add(new City() { Id = 1, ParentId = 0, CityName = "China" });
            city.Add(new City() { Id = 2, ParentId = null, CityName = "America" });
            city.Add(new City() { Id = 3, ParentId = 1, CityName = "Guangdong" });

            IList<City> results = new List<City>();
            ReSortList<City>(city, ref results, 0);  //error
        }
}


You can't Add on IEnumerable you have to provide an output type that supports this operation such as IList.

Moreover, you can't access a Property ParentId on the type T, which is unknown in the scope of your method.

[EDIT] This may help you :

public class City
{
    public int Id;
    public int? ParentId;
    public string CityName;
}

public class ProductCategory
{
    public int Id;
    public int? ParentId;
    public string Category;
    public int Price;
}

public class Test
{

    public void f()
    {
        List<City> city = new List<City>();

        city.Add(new City() { Id = 1, ParentId = 0, CityName = "China" });
        city.Add(new City() { Id = 2, ParentId = null, CityName = "America" });
        city.Add(new City() { Id = 3, ParentId = 1, CityName = "Guangdong" });
        int searchedId = 0;
        IList<City> results = city.FindAll(delegate(City c)
                                               {
                                                   return c.ParentId.HasValue &&
                                                          c.ParentId == searchedId;
                                               });
    }
}


Don't make it generic. Your method only takes in a sequence of City and it only appends to a list of City, so why should the method take a sequence of T? There is nothing at all generic about this method; it cannot possibly operate on a sequence of integers or a sequence of strings, so don't make it generic.


If you only have ProductCategory and City objects (distinctly unrelated objects), just create two methods. Otherwise give both objects a common interface like IHasParentID so that you can expose the common functionality.


OK I've just had a look, and I've got 2 points:

  • IList and IEnumerable are not interchangeable - change IList<City> results to IEnumerable<City> results or change your function to take IList<City> instead of IEnumerable<City>.
  • Your Test() method cannot be called the same as the class (Test) so rename it
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号