2012-03-23 17 views
11

ठीक है तो मैं सी # में दो सूचियों हैसी # में दो सूचियों में अंतर कैसे प्राप्त करूं?

List<Attribute> attributes = new List<Attribute>(); 
List<string> songs = new List<string>(); 

एक तार की है और और एक एक विशेषता उद्देश्य यह है कि मैं साधारण created..very की है

class Attribute 
{ 
    public string size { get; set; } 
    public string link { get; set; } 
    public string name { get; set; } 
    public Attribute(){} 
    public Attribute(string s, string l, string n) 
    { 
     size = s; 
     link = l; 
     name = n; 
    } 
} 

मैं अब देखने के लिए तुलना करने के लिए है तो उदाहरण के लिए

songs.Add("something"); 
songs.Add("another"); 
songs.Add("yet another"); 

Attribute a = new Attribute("500", "http://google.com", "something"); 
attributes.Add(a); 

मैं वापस जाने के लिए एक तरह से चाहते क्या गीत गुण नाम में नहीं हैं "एक और" और "अभी तक एक और" क्योंकि उनमें उन विशेषताओं सूची n में नहीं हैं एएमई

तो स्यूडोकोड के लिए

difference = songs - attributes.names 

उत्तर

33
var difference = songs.Except(attributes.Select(s=>s.name)).ToList(); 

संपादित

जोड़ा गया ToList() यह एक सूची

+0

इच्छा अंतर एक सूची – Trace

+1

नहीं, IEnumerable है हो सकता है, लेकिन ToList() –

+0

एक गणनीय कहते हैं। यदि आपको आवश्यकता है तो ToList() का उपयोग करें। –

4
var diff = songs.Except(attributes.Select(a => a.name)).ToList(); 
4

इस तरह सभी गीत को मिल रहा है बनाने के लिए जो विशेषता नामों में शामिल नहीं हैं:

var result = songs 
    .Where(!attributes.Select(a => a.name).ToList().Contains(song)); 

एक्सेप्ट का उपयोग करने का उत्तर भी सही और शायद अधिक कुशल है।

संपादित करें: यदि आप LINQ से SQL में इसका उपयोग कर रहे हैं तो इस सिंटैक्स का एक फायदा है: यह NOT IN एसक्यूएल भविष्यवाणी में अनुवाद करता है। Except एसक्यूएल में किसी भी चीज़ का अनुवाद नहीं किया गया है। तो, उस संदर्भ में, सभी रिकॉर्ड डेटाबेस से पुनर्प्राप्त किए जाएंगे और ऐप पक्ष को छोड़कर, जो बहुत कम कुशल है।

+0

यदि आपने 'बहिष्करण' का उपयोग करने वाले अन्य उत्तरों सही और अधिक कुशल हैं तो आप इसे क्यों पोस्ट करते हैं? –

+0

यदि आप इसे देखते हैं, तो मैंने इसे अन्य उत्तरों से पहले पोस्ट किया है, और बाद में टिप्पणी को जोड़ा, स्पष्ट रूप से बताते हुए कि अन्य समाधान बेहतर हैं। – JotaBe

+1

"मैंने इसे अन्य उत्तरों से पहले पोस्ट किया।" तुमने नहीं किया –

6

यह उनका कहना है कि जवाब यहां पोस्ट attributes.names में songs मौजूद नहीं की एक सूची प्रदान करेगा लायक है, लेकिन यह आप songs में मौजूद नहीं attributes.names की एक सूची में नहीं डालेंगे।

जबकि ओपी चाहता था, शीर्षक थोड़ा भ्रामक हो सकता है, खासकर यदि (मेरे जैसा) आप यहां जांचने के लिए एक तरीका ढूंढ रहे हैं कि दो सूचियों की सामग्री अलग-अलग है या नहीं। यदि यह तुम क्या चाहते है, तो आप निम्न का उपयोग कर सकते हैं: -

var differences = new HashSet(songs); 
differences.SymmetricExceptWith(attributes.Select(a => a.name)); 
if (differences.Any()) 
{ 
    // The lists differ. 
} 
संबंधित मुद्दे