我有以下代码:
foreach (Logs log in _logsDutyStatusChange)
{
string driverid = log.did;
}
我如何只将不同的驱动程序ID添加到driverid字符串?
由于
答案 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
。