我有以下代码:C#的foreach只得到不同的值
foreach (Logs log in _logsDutyStatusChange)
{
string driverid = log.did;
}
我怎么会只添加不同的驱动程序ID的到driverid字符串?
感谢
我有以下代码:C#的foreach只得到不同的值
foreach (Logs log in _logsDutyStatusChange)
{
string driverid = log.did;
}
我怎么会只添加不同的驱动程序ID的到driverid字符串?
感谢
您的代码现在不添加任何东西,它只是在每个值中设置一个字符串(在循环范围内声明)。最终的结果将只是最后一个值,而且无论如何它将超出以下代码的范围。如果你想将它们全部追加到一个字符串,用逗号分隔,例如,试试这个:
string driverids = string.Join(",", _logsDutyStatusChange
.Select(item=>item.did)
.Distinct()
.ToArray());
首先,建立一个比较器类,并实现接口:
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
}
mhh ...也许用IEnumerable<T>
的Distinct()
函数?
你应该这样做:
foreach (string id in _logsDutyStatusChange.Select(x=>x.did).Distinct())
{
string driverid = id;
}
你可以,如果你的日志类实现IEquatable
否则使用DISTINCT,快速 '哈克' 修复可以使用类似
foreach (var group in _logsDutyStatusChange.GroupBy(l => new { log.did, .... more identifying fields })
{
string driverid = group.Key.did;
}
C#4.0元组有'automagic'比较/等同
相反foreach'ing _logsDutyStatusChange的,你可以使用LINQ打通那些不同的集合和循环,代之以:
foreach (Logs log in _logsDutyStatusChange.Select(l => l.did).Distinct())
{
//Handling code here
}
实施将完全取决于您打算如何处理结果。
这里有一个办法:
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
秒。
这应该工作(不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);
}
+1,但如果OP不知道LINQ的一个例子将是有益的;) – 2011-04-18 14:21:00
嗯......似乎有一些例子这个页面;) – DarkSquirrel42 2011-04-18 14:28:12