मेरे पास दो रिकॉर्ड संरचनाएं और दो सूचियां निम्नानुसार हैं:

 public struct gtAliasRecType : ICloneable
    {
        public int lRecordNum; 
        public double dLocationCd; 
    }

   public struct gtCVARecType : ICloneable
    {
        public double dLocationCd; 
    }

    static public List<gtCVARecType> LCVARec = null; 
    static public List<gtAliasRecType> LAliasRec = null;

अब मैं "LAliasRec" सूची को पुनरावृत्त करना चाहता हूं और यह पता लगाना चाहता हूं कि "LCVARec" सूची में समान "dLocationCd" मौजूद है या नहीं।

मैंने सूची के "Contains" और "Find" फ़ंक्शन का उपयोग करने का प्रयास किया1 लेकिन त्रुटियों में समाप्त हो गया।

 public static void XYZ()
    {
        gtAliasRecType uAliasRec = gtAliasRecType.CreateInstance();
        gtCVARecType uCVARec = gtCVARecType.CreateInstance();
        
        for (int i = 0; i < LAliasRec.Count; i++)
        {
           uAliasRec = LAliasRec[i];               

            //trying Find method 
            gtCVARecType c1  = LCVARec.Find(uAliasRec.dLocationCd);

            //trying Contains method 
            bool nReturn = LCVARec.Contains( uAliasRec.dLocationCd );
            
        }
    }

हालांकि, मैं "डबल' से 'gtCVARecType' त्रुटि में कनवर्ट नहीं कर सकता।

शामिल हैं और खोजें

अग्रिम में धन्यवाद :)

-2
Abhishek Singh 23 अगस्त 2020, 18:39

3 जवाब

सबसे बढ़िया उत्तर

आप किसी भिन्न प्रकार के आइटम को खोजने के लिए Contains का उपयोग नहीं कर सकते। आप Find का उपयोग कर सकते हैं, लेकिन मैं व्यक्तिगत रूप से LINQ Any विधि का उपयोग करूंगा:

foreach (var uAliasRec in LAliasRec)
{
    bool nReturn = LCVARec.Any(rec => rec.dLocationCd == uAliasRec.dLocationCd);
    // Presumably do something with nReturn
}

यदि सूचियां बड़ी हैं, तो हो सकता है कि आप पहले सभी स्थानों के लिए एक HashSet<double> बनाना चाहें, जो एक अग्रिम लागत है जो बाकी सब कुछ सस्ता कर देगी:

HashSet<double> locations = new HashSet<double>(LCVARec.Select(rec => rec.dLocationCd));
foreach (var uAliasRec in LAliasRec)
{
    bool nReturn = locations.Contains(uAliasRec.dLocationCd);
    // Presumably do something with nReturn
}

इसके अलावा, मैं आपको दृढ़ता से सलाह दूंगा कि आप नियमित .NET नामकरण परंपराओं का पालन करना शुरू करें। अपने वर्तमान स्वरूप में, आपका कोड किसी के लिए भी काम करने के लिए नियमित C# कोड के लिए उपयोग करने के लिए बहुत कठिन होने वाला है।

3
Jon Skeet 23 अगस्त 2020, 20:23

आप LINQ और इनर जॉइन का उपयोग कर सकते हैं। दो सूचियों का प्रतिच्छेदन ज्ञात कीजिए।

var query = from lcva in LCVARec
            join lAlias in LAliasRec on lcva.dLocationCd equals lAlias.dLocationCd
            select lcva;

Console.WriteLine(query.Count()); //prints number of matching items.

अपडेट करें

अगर आप SortedDictionary<TKey, TValue> के List<T> को SortedList<TKey, TValue> में बदल सकते हैं तो यह जल्दी देखने में मदद करेगा।

यदि आप Contains() का उपयोग करना पसंद करते हैं तो आपको IEquatable<T> को लागू करना होगा और यदि आप प्रदर्शन चाहते हैं तो आपको Sort() करना होगा जिसके लिए कक्षा में IComparable<T> होना चाहिए और फिर BinarySearch करना होगा।

संदर्भ : https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1?view=netcore-3.1#remarks

1
Ramesh 23 अगस्त 2020, 20:14

Intersect का उपयोग करने के बारे में क्या

 var results = LAliasRec
     .Select(x => x.dLocationCd)
     .Intersect(LCVARec.Select(x => x.dLocationCd));
 bool exists = results.Count() > 0;

Select केवल दोहरे मान हैं, और प्रतिच्छेद वाले मान प्राप्त करें। यदि Count 0 से अधिक, तो आपको पारस्परिक संपत्ति मूल्य मिलते हैं।

1
Olivier Jacot-Descombes 23 अगस्त 2020, 19:40