class Program
{
static void Main(string[] args)
{
List<Book> books = new List<Book>
{
new Book
{
Name="C# in Depth",
Authors = new List<Author>
{
new Author
{
FirstName = "Jon", LastName="Skeet"
},
new Author
{
FirstName = "Jon", LastName="Skeet"
},
}
},
new Book
{
Name="LINQ in Action",
Authors = new List<Author>
{
new Author
{
FirstName = "Fabrice", LastName="Marguerie"
},
new Author
{
FirstName = "Steve", LastName="Eichert"
},
new Author
{
FirstName = "Jim", LastName="Wooley"
},
}
},
};
var temp = books.SelectMany(book => book.Authors).Distinct();
foreach (var author in temp)
{
Console.WriteLine(author.FirstName + " " + author.LastName);
}
Console.Read();
}
}
public class Book
{
public string Name { get; set; }
public List<Author> Authors { get; set; }
}
public class Author
{
public string FirstName { get; set; }
public string LastName { get; set; }
public override bool Equals(object obj)
{
return true;
//if (obj.GetType() != typeof(Author)) return false;
//else return ((Author)obj).FirstName == this.FirstName && ((Author)obj).FirstName == this.LastName;
}
}
यह "LINQ इन एक्शन" में एक उदाहरण पर आधारित है। लिस्टिंग 4.16।अलग-अलग LINQ से ऑब्जेक्ट्स
यह जॉन स्कीट को दो बार प्रिंट करता है। क्यूं कर? मैंने लेखक वर्ग में बराबर विधि को ओवरराइड करने का भी प्रयास किया है। अभी भी अलग काम नहीं लग रहा है। मैं क्या खो रहा हूँ?
संपादित करें: मैंने == और! = ऑपरेटर अधिभार भी जोड़ा है। अभी भी कोई मदद नहीं।
public static bool operator ==(Author a, Author b)
{
return true;
}
public static bool operator !=(Author a, Author b)
{
return false;
}
आईक्वाटेबल ठीक है लेकिन अपूर्ण है; आपको हमेशा ऑब्जेक्ट। एक्वाल्स() और ऑब्जेक्ट। गेटहाशकोड() को लागू करना चाहिए; IEquatableEquals ऑब्जेक्ट.क्वाल्स को ओवरराइड नहीं करता है, इसलिए गैर-दृढ़ता से टाइप की गई तुलना करने पर यह असफल हो जाएगा, जो अक्सर ढांचे में और हमेशा गैर-जेनेरिक संग्रह में होता है। –
AndyM
क्या रेक्स एम ने सुझाव दिया है कि डिक्विंट के ओवरराइड का उपयोग करना बेहतर है जो IEqualityComparer लेता है? मेरा मतलब है कि अगर मैं जाल में गिरना नहीं चाहता तो मुझे क्या करना चाहिए। –
Tanmoy
@Tanmoy यह निर्भर करता है। यदि आप चाहते हैं कि लेखक सामान्य रूप से सामान्य ऑब्जेक्ट की तरह व्यवहार करें (यानी केवल संदर्भ समानता) लेकिन अलग-अलग उद्देश्य के लिए नाम मानों की जांच करें, IqualityComparer का उपयोग करें। यदि आप * हमेशा * ऑब्जेक्ट ऑब्जेक्ट्स को नाम मानों के आधार पर तुलना करना चाहते हैं, तो GetHashCode और Equals को ओवरराइड करें, या IEquatable को लागू करें। –