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(记录);
}