C#foreach只获得不同的值

时间:2011-04-18 14:16:26

标签: c#

我有以下代码:

foreach (Logs log in _logsDutyStatusChange)
{
    string driverid = log.did;
}

我如何只将不同的驱动程序ID添加到driverid字符串?

由于

8 个答案:

答案 0 :(得分:12)

你应该这样做:

foreach (string id in _logsDutyStatusChange.Select(x=>x.did).Distinct())
{
    string driverid = id;
}

答案 1 :(得分:6)

mhh ......也许使用IEnumerable< T >的{​​{1}}函数?

答案 2 :(得分:4)

您的代码现在没有添加任何内容,只是将字符串(在循环范围内声明)设置为每个值。最终结果将只是最后一个值,并且无论如何它将超出以下代码的范围。如果您尝试将它们全部附加到以逗号分隔的字符串中,例如,请尝试以下操作:

string driverids = string.Join(",", _logsDutyStatusChange
  .Select(item=>item.did)
  .Distinct()
  .ToArray());

答案 3 :(得分:2)

这应该有效(没有linq):

Hashset<string> alreadyEncountered = new Hashset<string>();
foreach (Logs log in _logsDutyStatusChange)
{
    if(alreadyEncountered.Contains(log.did))
    {
        continue;
    }
    string driverid = log.did;
    alreadyEncountered.Add(driverid);
}

答案 4 :(得分:1)

首先,创建一个比较器类并实现IEqualityComparer<Log>接口:

public class LogComparer : IEqualityComparer<Log>
{
    public bool Equals(Log one, Log two)
    {
        return one.did.Equals(two.did);
    }

    public int GetHashCode(Log log)
    { 
        return log.did.GetHashCode();
    }
}

然后使用带有相等比较器实例的Enumerable.Distinct()方法的重载:

foreach(var log in _logsDutyStatusChange.Distinct(new LogComparer()))
{
    // Work with each distinct log here
}

答案 5 :(得分:1)

而不是foreach'ing _logsDutyStatusChange,你可以使用LINQ获取不同的集合并循环遍历这些集合,而不是:

foreach (Logs log in _logsDutyStatusChange.Select(l => l.did).Distinct())
{
    //Handling code here
}

实施将完全取决于您打算如何处理结果。

答案 6 :(得分:0)

如果您的Logs类实现IEquatable

,则可以使用Distinct

否则,快速'hacky'修复可以使用类似

的内容
foreach (var group in _logsDutyStatusChange.GroupBy(l => new { log.did, .... more identifying fields })
{
    string driverid = group.Key.did;
}

C#4.0元组也有'自动'比较/等同

答案 7 :(得分:0)

这是一种方法:

HashSet<string> SeenIDs = new HashSet<string>();

foreach (Logs log in _logsDutyStatusChange)
{
    if (SeenIDs.Contains(log.did)) break;
    SeenIDs.Add(log.did);

    string driverid = log.did;
}

Distinct()在这里不起作用,因为它只会让你获得不同的did