C# 分别显示每个用户ID的开始和结束时间

C# 分别显示每个用户ID的开始和结束时间,c#,list,loops,for-loop,arraylist,C#,List,Loops,For Loop,Arraylist,我在每个UserId上运行foreach循环,但出于某种原因。。。在我的xml中,仅显示一个用户ID,以及所有用户ID的所有开始时间和结束时间。我需要它分别显示每个userId的start和end时间 看起来是这样的: User2 Start End Start End Start End User1 Start End Start End User2 Start End UserId Time EventType Test1 xx-xx-xxxx Start

我在每个
UserId
上运行
foreach
循环,但出于某种原因。。。在我的
xml
中,仅显示一个
用户ID
,以及所有
用户ID的所有开始时间和结束时间。我需要它分别显示每个
userId
start
end
时间

看起来是这样的:

User2
Start
End
Start
End
Start
End
User1
Start
End
Start
End

User2
Start
End
UserId    Time        EventType
Test1   xx-xx-xxxx   Start
Test1   xx-xx-xxxx   End
Test2   xx-xx-xxxx   Start
它需要如下所示:

User2
Start
End
Start
End
Start
End
User1
Start
End
Start
End

User2
Start
End
UserId    Time        EventType
Test1   xx-xx-xxxx   Start
Test1   xx-xx-xxxx   End
Test2   xx-xx-xxxx   Start
我的代码:

foreach (String userId in request.Users) // request.Users is a Array of UserId's 
{
    List<UserModel> result = // I am making my DataAccess Layer call here.
    UserRecord record = new UserRecord();
    record.UserId = userId;
    record.TimePeriodList = new List<TimePeriod>();
    for (int i = 0; i < result.Count; i += 2)
    {
        TimePeriod timeData = new TimePeriod();
        timeData.StartTime = result[i].TimeDate;
        // if result count is an odd number and this is the last iteration for the UserId
        if (((result.Count & 1) == 1) && (i == result.Count))
            {
                timeData.EndTime = result[i + 1].TimeDate;
            }
            record.TimePeriodList.Add(timeData);
        }
        response.UserRecordList = new List<UserRecord>();
        response.UserRecordList.Add(record);
}

public class GetUserResponse
{
    private List<UserRecord> userRecordList;

    public List<UserRecord> UserRecordList
    {
        get { return userRecordList; }
        set { userRecordList = value; }
    }
}

public class UserRecord
{
    private string userId;
    private List<TimePeriod> timePeriodList;

    public string UserId
    {
        get { return userId; }
        set { userId = value; }
    }

    public List<TimePeriod> TimePeriodList
    {
        get { return timePeriodList; }
        set { timePeriodList = value; }
    }
}

public class TimePeriod
{
    private DateTime startTime;
    private DateTime endTime;

    public DateTime StartTime
    {
        get { return startTime; }
        set { startTime = value; }
    }

    public DateTime EndTime
    {
        get { return endTime; }
        set { endTime = value; }
    }
}

因此,如果有一个奇数,那么该
用户的结束时间默认为
DateTime.MinValue

如果您单步执行程序,注意变量的状态,您可以很容易地发现错误。您的代码几乎可以正常工作,因为您可以返回结果。您看到的唯一结果是最后一个用户

让我们看看您的循环:

// you have created a response object here which I had to infer
var response = new GetUserResponse();  // added so my explanation makes sense

foreach (String userId in request.Users) // request.Users is a Array of UserId's 
{
    List<UserModel> result = // I am making my DataAccess Layer call here.
    UserRecord record = new UserRecord();
    // removed stuff that already works
    response.UserRecordList = new List<UserRecord>();
    response.UserRecordList.Add(record);
}
如果我们单步执行,直到行
response.UserRecordList=newlist()这是状态:

response = instance1 of GetUserResponse
response.UserRecordList = null;
userId = test1
response = instance1 of GetUserResponse
response.UserRecordList = null;
userId = test1
record = instance1 of UserRecord with values in its fields
当我们跨过下一行时,状态变为

response.UserRecordList = new instance of List<UserRecord>(); // list1
现在,我们从数组中获取下一项,以便
userId
成为test2。 让我们再次运行到上一行,直到现在UserRecordList仍然有1个UserRecord,但是如果我们跨过这一行,就会创建一个新的实例,我将其称为列表2:

response.UserRecordList = new instance of List<UserRecord>(); // list2
response.UserRecordList=列表()的新实例;//清单2
通过这一步,前面的列表1不再被引用,稍后将被垃圾收集。在最后一行中,添加了test2的UserRecord,然后我们就完成了

显然,创建userrecord列表的行不应该在foreach循环中

修复相当容易

var response = new GetUserResponse();  // added so my explanation makes sense
response.UserRecordList = new List<UserRecord>(); // init List once

foreach (String userId in request.Users) // request.Users is a Array of UserId's 
{
    List<UserModel> result = // I am making my DataAccess Layer call here.
    UserRecord record = new UserRecord();
    // removed stuff that already works
    // don't init the UserRecordList here, it is done at the start of the loop.
    response.UserRecordList.Add(record);
}
var response=new GetUserResponse();//所以我的解释是有意义的
response.UserRecordList=新列表();//初始化列表一次
foreach(request.Users中的字符串userId)//request.Users是userId的数组
{
List result=//我正在这里进行数据访问层调用。
UserRecord=新的UserRecord();
//删除了已经有效的东西
//不要在这里初始化UserRecordList,它是在循环开始时完成的。
response.UserRecordList.Add(记录);
}

如果您单步执行程序,注意变量的状态,就可以很容易地发现错误。您的代码几乎可以正常工作,因为您可以返回结果。您看到的唯一结果是最后一个用户

让我们看看您的循环:

// you have created a response object here which I had to infer
var response = new GetUserResponse();  // added so my explanation makes sense

foreach (String userId in request.Users) // request.Users is a Array of UserId's 
{
    List<UserModel> result = // I am making my DataAccess Layer call here.
    UserRecord record = new UserRecord();
    // removed stuff that already works
    response.UserRecordList = new List<UserRecord>();
    response.UserRecordList.Add(record);
}
如果我们单步执行,直到行
response.UserRecordList=newlist()这是状态:

response = instance1 of GetUserResponse
response.UserRecordList = null;
userId = test1
response = instance1 of GetUserResponse
response.UserRecordList = null;
userId = test1
record = instance1 of UserRecord with values in its fields
当我们跨过下一行时,状态变为

response.UserRecordList = new instance of List<UserRecord>(); // list1
现在,我们从数组中获取下一项,以便
userId
成为test2。 让我们再次运行到上一行,直到现在UserRecordList仍然有1个UserRecord,但是如果我们跨过这一行,就会创建一个新的实例,我将其称为列表2:

response.UserRecordList = new instance of List<UserRecord>(); // list2
response.UserRecordList=列表()的新实例;//清单2
通过这一步,前面的列表1不再被引用,稍后将被垃圾收集。在最后一行中,添加了test2的UserRecord,然后我们就完成了

显然,创建userrecord列表的行不应该在foreach循环中

修复相当容易

var response = new GetUserResponse();  // added so my explanation makes sense
response.UserRecordList = new List<UserRecord>(); // init List once

foreach (String userId in request.Users) // request.Users is a Array of UserId's 
{
    List<UserModel> result = // I am making my DataAccess Layer call here.
    UserRecord record = new UserRecord();
    // removed stuff that already works
    // don't init the UserRecordList here, it is done at the start of the loop.
    response.UserRecordList.Add(record);
}
var response=new GetUserResponse();//所以我的解释是有意义的
response.UserRecordList=新列表();//初始化列表一次
foreach(request.Users中的字符串userId)//request.Users是userId的数组
{
List result=//我正在这里进行数据访问层调用。
UserRecord=新的UserRecord();
//删除了已经有效的东西
//不要在这里初始化UserRecordList,它是在循环开始时完成的。
response.UserRecordList.Add(记录);
}