Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 泛型与IList相关_C#_Generics - Fatal编程技术网

C# 泛型与IList相关

C# 泛型与IList相关,c#,generics,C#,Generics,我有下面的代码-一个通用方法,它将List作为输入参数之一。在该方法中,有一个IF/ELSEIF语句,它运行在一个公共LINQ调用中。 请帮助我,这样LINQ呼叫就可以为所有IF/ELSEIF共用 private Boolean filterList<T>(List<T> anyOutdoorSports, int numberOfPartcipants) { if (anyOutdoorSports == null){ return false ;} B

我有下面的代码-一个通用方法,它将List作为输入参数之一。在该方法中,有一个IF/ELSEIF语句,它运行在一个公共LINQ调用中。 请帮助我,这样LINQ呼叫就可以为所有IF/ELSEIF共用

private Boolean filterList<T>(List<T> anyOutdoorSports, int numberOfPartcipants)
{
    if (anyOutdoorSports == null){ return false ;}
    Boolean _returnValue = false;

    if (anyOutdoorSports.GetType() == typeof(List<Swimming>))
    {
        List<Swimming> Swimming = anyOutdoorSports.Cast<Swimming>().ToList();

        if (Swimming.Count > 0)
        {
            int listCount = (from rca in Swimming
                             where (rca.RecordFields[numberOfPartcipants].ToString()).StartsWith("stamina")
                             select rca).Count();
            _returnValue = listCount > 0 ? true : false;
        }
    }
    else if (anyOutdoorSports.GetType() == typeof(List<Tennis>))
    {
        List<Tennis> Tennis = anyOutdoorSports.Cast<Tennis>().ToList();

        if (Tennis.Count > 0)
        {
            int listCount = (from rca in Tennis
                             where (rca.RecordFields[numberOfPartcipants].ToString()).StartsWith("stamina")
                             select rca).Count();
            _returnValue = listCount > 0 ? true : false;
        }
    }
    else if (anyOutdoorSports.GetType() == typeof(List<Soccer>))
    {
        List<Soccer> Soccer = anyOutdoorSports.Cast<Soccer>().ToList();

        if (Soccer.Count > 0)
        {
            int listCount = (from rca in Soccer
                             where (rca.RecordFields[numberOfPartcipants].ToString()).StartsWith("stamina")
                             select rca).Count();
            _returnValue = listCount > 0 ? true : false;
        }
    }

    return _returnValue;
}

感谢所有查看和帮助您的人。

因为您的所有类型似乎都有一个RecordFields属性,所以您可以添加一个接口并使用它来代替泛型


除此之外,您还必须求助于Func表达式。

假设所有类都从包含记录字段的相同基类继承,您可以在方法上创建泛型约束并完全删除ifs

private Boolean filterList<T>(List<T> anyOutdoorSports, int numberOfPartcipants)
  where T : OutdoorSport
{
    if (anyOutdoorSports == null){ return false ;}
    Boolean _returnValue = false;

    if (anyOutdoorSports.Count > 0)
    {
        int listCount = (from rca in anyOutdoorSports
                         where (rca.RecordFields[numberOfPartcipants].ToString()).StartsWith("stamina")
                         select rca).Count();
        _returnValue = listCount > 0;
    }

    return _returnValue;
}

如果网球、足球和游泳有一个具有RecordFields属性的公共基类,则这很简单:

private boolean FilterList<T>(IEnumerable<T> anyOutdoorSports, int numberOfParticipants) where T : OutdoorSport
{
    if(anyOutdoorSports == null) return false;
    return anyOutdoorSports.Any(s => s.RecordFields[numberOfParticipants].ToString().StartsWith("stamina"));
}

如果游泳、网球和足球派生自同一基类,则不应使用泛型,而应使用接受列表的方法。尽管所有子类的基类中都有“RecordFields”属性,但我仍然会遇到以下错误。是因为“RecordFields”在基类和派生类中都是只读的吗“T”不包含“RecordFields”的定义,并且找不到接受类型为“T”的第一个参数的扩展方法“RecordFields”?是否缺少using指令或程序集引用?@CocaCola-方法定义中是否有where约束,即where T:BaseClass?尽管“RecordFields”是基类中的属性对于所有子类,我仍然得到以下错误。是因为“RecordFields”在基类和派生类中都是只读的吗“T”不包含“RecordFields”的定义,并且找不到接受类型为“T”的第一个参数的扩展方法“RecordFields”?是否缺少using指令或程序集引用?@CocaCola,是否将where T:OutdoorSport添加到方法签名中?