2011-04-18 14 views

उत्तर

4

आपका कोड अभी कुछ भी नहीं जोड़ रहा है, यह केवल प्रत्येक स्ट्रिंग को एक स्ट्रिंग (लूप के दायरे में घोषित) सेट कर रहा है। अंतिम परिणाम केवल अंतिम मूल्य होगा, और यह वैसे भी निम्नलिखित कोड के दायरे से बाहर होगा। इसके बजाय _logsDutyStatusChange foreach'ing की

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

सबसे पहले, एक comparer वर्ग बना सकते हैं और इंटरफ़ेस को लागू:

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() विधि का अधिभार कि समानता comparer का एक उदाहरण ले जाता है का उपयोग करें:

foreach(var log in _logsDutyStatusChange.Distinct(new LogComparer())) 
{ 
    // Work with each distinct log here 
} 
6

mhh ... शायद IEnumerable<T> का Distinct() फ़ंक्शन का उपयोग करें?

+1

+1, लेकिन अगर ओपी Linq पता नहीं है एक उदाहरण के लिए उपयोगी होगा;) –

+0

ठीक है ... ऐसा लगता है वहाँ पर कुछ उदाहरण हैं कि यह पृष्ठ;) – DarkSquirrel42

10

आप क्या करना चाहिए:

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

'डिस्टिंट' के बाद 'अंतिम' का उपयोग भी कर सकता है और 'foreach' – juharr

+3

@juharr से गुजर सकता है: मुझे लगता है कि लूप बॉडी के भीतर केवल एक परिवर्तनीय घोषणा के मुकाबले वास्तव में अधिक कोड है। –

+0

ठीक है, मुझे यकीन नहीं था कि वह लूप में आईडी के साथ कुछ और कर रहा है, क्योंकि मुझे लगता है कि यह सिर्फ एक नमूना है जिसे उसने पोस्ट किया था। – Andrei

0

आप अलग अपने लॉग्स वर्ग IEquatable

अन्यथा लागू करता है, तो उपयोग कर सकते हैं, एक त्वरित 'hacky' ठीक तरह कुछ का उपयोग किया जा सकता है

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

सी # 4.0 टुपल्स में 'automagic' की तुलना/समीकरण

1

, आप 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 रों मिल जाएगा:

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); 
} 
संबंधित मुद्दे