C#比较两个对象值

时间:2011-04-18 16:00:09

标签: c#

我有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))
                {

                }

            }

5 个答案:

答案 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))
    {

    }

 }