我有2个List对象。
private static List<Logs> _logsDutyStatusChange = new List<Logs>();
private static List<Logs> _logsNonDutyStatusChange = new List<Logs>();
这两个列表都包含一个驱动程序和日期。
我需要查看_logsNonDutyStatusChange
中哪些驱动程序位于_logsDutyStatusChange
中。
如果他们在_logsNonDutyStatusChange
,请将_logsDutyStatusChange
中的日期替换为_logsNonDutyStatusChange
中的最大日期。
我将如何解决这个问题。现在我有以下(不起作用):
foreach (Logs log in _logsDutyStatusChange)
{
if (_logsNonDutyStatusChange.Contains(log.did))
{
}
}
答案 0 :(得分:4)
如果你可以使用Linq:
var lookup = _logsNonDutyStatusChange.ToLookup(l => l.did);
foreach (Logs log in _logsDutyStatusChange)
{
if (lookup.Contains(log.did))
{
var maxDate = lookup[log.did].Max(l => l.date);
log.date = maxDate;
}
}
答案 1 :(得分:3)
您可以实施IEquatable<T>
答案 2 :(得分:1)
如果您想纯粹使用Linq方式
,请尝试使用 _logsDutyStatusChange.Where(x=> _logsNonDutyStatusChange.Any(y=>y.DriveId == x.DriveId))
.ToList().ForEach(xx => xx.Date = _logsNonDutyStatusChange.Where(yy=>yy.DriveId==xx.DriveId)
.Max(yyy=>yyy.Date));
答案 3 :(得分:0)
如果必须使用for循环,则需要:
foreach (Logs log in _logsDutyStatusChange)
{
foreach (var nonDutyLog in _logsNonDutyStatusChange)
{
if (nonDutyLog.did.Equals(log.did))
{
// do something
}
}
}
但请注意,这是O(n * m),这是昂贵的,特别是如果你有很多条目。如果您需要这样的东西,您最好将其中一些查找转换为哈希表。快速简便的方法是使用ToLookup()
:
var nonDutyLookup = _logsNonDutyStatusChange.ToLookup(log => log.did, log => log);
foreach (Logs log in _logsDutyStatusChange)
{
foreach (matchingLog in nonDutyLookup[log.did])
{
// handle the matching log
}
}
答案 4 :(得分:0)
你可以尝试
foreach (Logs log in _logsDutyStatusChange)
{
if (_logsNonDutyStatusChange.Select (l => l.did).Contains(log.did))
{
}
}