转换类型c#

本文关键字:类型 转换 | 更新日期: 2023-09-27 18:17:03

我使用以下方法有困难:

public override List<Team> Search(Dictionary<string, string> prms,
                                    int pageSize, int page, out int results) 
{
    List<Team> t = null;
    //Team t = null;
    var tresults = new List<Team>();
    using (SqlConnection conn = DB.GetSqlConnection())
    {
        using (SqlCommand cmd = conn.CreateCommand())
        {
            cmd.CommandText = @"SearchForTeam";
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            foreach (var key in prms.Keys)
            {
                cmd.Parameters.Add(key, prms[key]);
            }
            SqlDataReader reader 
                      = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            while (reader.Read())
            {
                var temp = Load(reader);
                if (t == null)
                {
                    t = temp;
                }
                else
                {
                    t.CityHistory.Add(temp.CityHistory[0]);
                }
            }
        }
    }
    results = 0;
    return t;
}

错误主要在于if和else语句,其中if块中的temp声明它"不能隐式转换类型DataLayer"。Team to System.Collections.GenericList"

编辑:下面是我的加载方法:

        public Team Load(SqlDataReader reader)
    {
        var team = new Team()
        {
            TeamID = Int32.Parse(reader["TeamID"].ToString()),
            TeamName = reader["TeamName"].ToString()
        };
        team.CityHistory.Add(
            new TeamCity(
             Int32.Parse(reader["TeamCitiesID"].ToString()),
             team.TeamID,
             Int32.Parse(reader["CityID"].ToString()),
             reader["CityName"].ToString(),
             Int32.Parse(reader["YearStart"].ToString()),
             Int32.Parse(reader["YearEnd"].ToString())
            )
        );
    return team;
    }

转换类型c#

t定义为List<Team>,但您后来却说为t.CityHistory。CityHistory显然不是List<>的财产。我猜这是Team的一个属性,但既然你从来没有告诉我们,我们不能说。

告诉我们Team的定义和Load()的方法签名,也许我们能给出答案。

UPDATE (from OP's UPDATE)

现在,我将假设您将获得多行,每个城市一行,团队信息重复。你想要的是:

    var temp = Load(reader);
    // remove t definition above
    var  t = tresults.FirstOrDefault(team=> team.TeamId == temp.TeamId);

    if (t == null)
    {
        t = temp;
        tresults.Add(t);
    }
    else 
        t.CityHistory.Add(temp.CityHistory[0]);

(根据Steve的评论再次更新)

您必须首先将temp包装到List中以将其分配给t:

if (t == null) {
  t = new List<Team>() { temp }
} else {
  t.add(temp);
}

很长的评论:

考虑对你的方法进行如下重构:

private IEnumerable<Team> LoadTeams()
{
    using (SqlConnection conn = DB.GetSqlConnection())
    {
        using (SqlCommand cmd = conn.CreateCommand())
        {
            cmd.CommandText = @"SearchForTeam";
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            foreach (var key in prms.Keys)
            {
                cmd.Parameters.Add(key, prms[key]);
            }
            SqlDataReader reader 
                      = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            while (reader.Read())
            {
                yield return Load(reader);
            }
        }
    }
}
public override List<Team> Search(Dictionary<string, string> prms,
                                    int pageSize, int page, out int results) 
{
    List<Team> searchResult = new List<Team>; 
    //Team t = null;
    var tresults = new List<Team>();
    foreach(Team team in LoadTeams())
    {
         if (team .....)
             searchResult.Add(team);
    }
    results = 0;
    return searchResult;
}

考虑需要初始化:

    List<Team> searchResult = new List<Team>; 

并问自己:下面的摘录应该做什么?:

if (team .....)
   searchResult.Add(team);

注::

    results = 0;

应该看起来像:

    results = searchResult.Count;

我不得不在这里猜测一点,但我假设您的Load()方法返回数据类型'DataLayer '。Team',听起来像是一个Team,而你试图将它分配给't',这是一个团队列表。

试题:

t.Add(temp) 

t.Add(temp as Team). 

你总是使用'var'声明是没有帮助的。