2011-04-18 65 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); 
}