2011-04-18 67 views

回答

4

您的代碼現在不添加任何東西,它只是在每個值中設置一個字符串(在循環範圍內聲明)。最終的結果將只是最後一個值,而且無論如何它將超出以下代碼的範圍。如果你想將它們全部追加到一個字符串,用逗號分隔,例如,試試這個:

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

首先,建立一個比較器類,並實現接口:

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 
} 
6

mhh ...也許用IEnumerable<T>Distinct()函數?

+1

+1,但如果OP不知道LINQ的一個例子將是有益的;) – 2011-04-18 14:21:00

+0

嗯......似乎有一些例子這個頁面;) – DarkSquirrel42 2011-04-18 14:28:12

10

你應該這樣做:

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

不妨在'Distinct'之後使用'Last'並放棄'foreach' – juharr 2011-04-18 14:21:57

+3

@juharr:我認爲假設在循環體內有更多的代碼而不僅僅是一個變量聲明是合理的。 – 2011-04-18 14:23:05

+0

嗯,我不確定他是否在循環中使用id做別的事情,因爲我知道這只是他發佈的一個示例。 – Andrei 2011-04-18 14:24:00

0

你可以,如果你的日誌類實現IEquatable

否則使用DISTINCT,快速 '哈克' 修復可以使用類似

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

C#4.0元組有'automagic'比較/等同

1

相反foreach'ing _logsDutyStatusChange的,你可以使用LINQ打通那些不同的集合和循環,代之以:

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

實施將完全取決於您打算如何處理結果。

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秒。

1

這應該工作(不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); 
}