尝试将项目添加到列表时,Foreach循环中断

时间:2018-11-15 05:03:35

标签: c# loops xamarin foreach

我是一位Android开发人员,是Xamarin的新手。我想做的是,我从服务器获取JSON请求并将其添加到List(Object)中。然后,我想检查列表中的一些值,并根据这些值将这些数据添加到新的列表(相同结构)中。我已经在Android中使用JAVA做到了这一点,但是在c#中该方法不起作用。当我尝试将值添加到新列表时,循环首先中断。

我的服务...

public async Task<List<FpRankData>> GetFpData(string accessToken)
{
    List<FpRankData> myFpList = null;
    try
    {
        var client = new HttpClient();
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
        var json = await client.GetStringAsync("http://203.115.11.236:10455/MobileAuthWS/api/Agent/GetFP2018Rank");
        myFpList = JsonConvert.DeserializeObject<List<FpRankData>>(json);
    }
    catch (Exception e)
    {
        myFpList = null;
        Debug.WriteLine("fp_error : ", e);
    }
    return myFpList;

}

进行检查的方法...

    public List<FpRankData> fpFullList;
    public List<FpRankData> fpTempList;
    public List<FpRankData> fpRankList

    public async Task getFpDataAsync(string accessToken)
    {
        IsBusy = true;

        fpFullList = await _apiServices.GetFpData(accessToken);

        foreach (FpRankData item in fpFullList) {

            if (item.agentCode1.Equals(Settings.agentCode))
            {

                item.AgentName = ExceptBlanks(item.AgentName);

                fpTempList.Add(item);

                if (item.rank == 1)
                {
                    List<FpRankData> finList1 = new List<FpRankData>(fpFullList.GetRange(1, 1));
                    fpTempList.AddRange(finList1);
                }
                else
                {
                    List<FpRankData> finList1 = new List<FpRankData>(fpFullList.GetRange(0, 1));
                    fpTempList.AddRange(finList1);
                }

                if (item.rank == 110)
                {
                    List<FpRankData> finList110 = new List<FpRankData>(fpFullList.GetRange(108, 1));
                    fpTempList.AddRange(finList110);
                }
                else
                {
                    List<FpRankData> finList110 = new List<FpRankData>(fpFullList.GetRange(109, 1));
                    fpTempList.AddRange(finList110);
                }

                if (item.rank != 30)
                {
                    List<FpRankData> finList30 = new List<FpRankData>(fpFullList.GetRange(29, 1));
                    fpTempList.AddRange(finList30);
                }
                if (item.rank != 60)
                {
                    List<FpRankData> finList60 = new List<FpRankData>(fpFullList.GetRange(59, 1));
                    fpTempList.AddRange(finList60);
                }

                Debug.WriteLine(item.AgentName, " AgentName");
                Debug.WriteLine("");

            }
            else {
                Debug.WriteLine("AgentName ", " AgentName");
            }

        }

        fpRankList = fpTempList;

        Debug.WriteLine("ListCount : ", fpTempList.Count.ToString());

        IsBusy = false;

    }

    public string ExceptBlanks(string str)
    {
        string pattern = "\\s+";
        string replacement = " ";                      
        Regex rx = new Regex(pattern);
        string result = rx.Replace(str, replacement);
        return result;
    }

我已使用“设置”保存了代理的代码,并将其与列表进行了比较。

public class FpRankData
{
    public string agentCode1 { get; set; }
    public string agentCode2 { get; set; }
    public string AgentName { get; set; }
    public string Role { get; set; }
    public string branchCode { get; set; }
    public string branchName { get; set; }
    public string region { get; set; }
    public int nop_count { get; set; }
    public double fp { get; set; }
    public string lastPersistencyYear { get; set; }
    public string persistencyValue { get; set; }
    public int rank { get; set; }
    public string acheivement { get; set; }
}

我在Java android中所做的...(有效)

    ArrayList<UserData> finList = new ArrayList<>();
    finList.clear();

    for (UserData customer : rList) {

        if (customer.getAgentCode().equals(rAgentCode)) {

            finList.add(customer);
            if (customer.getuPosition() == 1) {
                ArrayList<UserData> finList1 = new ArrayList<>(rList.subList(1, 2));
                finList.addAll(finList1);
            } else {
                ArrayList<UserData> finList1 = new ArrayList<>(rList.subList(0, 1));
                finList.addAll(finList1);
            }

            if (customer.getuPosition() == 110) {
                ArrayList<UserData> finList110 = new ArrayList<>(rList.subList(108, 109));
                finList.addAll(finList110);
            } else {
                ArrayList<UserData> finList110 = new ArrayList<>(rList.subList(109, 110));
                finList.addAll(finList110);
            }

            if (customer.getuPosition() != 30) {
                ArrayList<UserData> finList30 = new ArrayList<>(rList.subList(29, 30));
                finList.addAll(finList30);
            }

            if (customer.getuPosition() != 60) {
                ArrayList<UserData> finList60 = new ArrayList<>(rList.subList(59, 60));
                finList.addAll(finList60);
            }

    }

2 个答案:

答案 0 :(得分:2)

好像您没有实例化fpTempListfpRankList的概率,而您试图向这些列表添加项目时却得到了NullReferenceException。因此,您可以在声明时将它们初始化为lkie以下内容,或者可以检查null并在getFpDataAsync()方法中对其进行初始化[使用它们之前]:

 public List<FpRankData> fpTempList = new List<FpRankData>();
 public List<FpRankData> fpRankList = new List<FpRankData>();

答案 1 :(得分:1)

您必须使用以下新列表初始化fpTempListfpRankList

public List<FpRankData> fpTempList = new List<FpRankData>();
public List<FpRankData> fpRankList = new List<FpRankData>();

未经初始化,您无法将任何对象添加到列表中,它将给您NullReferenceException