我有以下代碼: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