मेरे पास निम्न कोड है:

public class DataClass
{
  public int Number1 {get; set;}
  public int Number2 {get; set;}
}

List<DataClass> list = new List<DataClass>();
list.Add(new DataClass {Number1= 1, Number2 = 100});
list.Add(new DataClass {Number1= 2, Number2 = 100});
list.Add(new DataClass {Number1= 3, Number2 = 101});
list.Add(new DataClass {Number1= 4, Number2 = 102});
list.Add(new DataClass {Number1= 5, Number2 = 103});
list.Add(new DataClass {Number1= 6, Number2 = 104});
list.Add(new DataClass {Number1= 7, Number2 = 104});    

जैसा कि आप देख सकते हैं, मेरे पास Number2 के लिए एक डुप्लिकेट मान हैं (यानी, दो DataClass ऑब्जेक्ट Number2 के साथ 100 पर सेट हैं, और दो सेट 104) . मैं नीचे की तरह एक शब्दकोश उत्पन्न करना चाहता हूं जिसमें इन डुप्लिकेट को शामिल नहीं किया गया है:

Key = 1, value = {Number1 = 1, Number2 = 100}
                 {Number1 = 3, Number2 = 101}
                 {Number1 = 4, Number2 = 102}
                 {Number1 = 5, Number2 = 103}
                 {Number1 = 6, Number2 = 104}

Key = 2, value = {Number1 = 2, Number2 = 100}
                 {Number1 = 7, Number2 = 104}

मैं इसे हल करने के लिए एक इष्टतम एल्गोरिदम प्राप्त करना चाहता हूं।

-4
Song 25 फरवरी 2020, 00:57
क्या इससे आपके सवाल का जवाब मिलता है? linq का उपयोग करके सूची में डुप्लीकेट निकालें
 – 
Jeremy Caney
25 फरवरी 2020, 01:13
4
कम से कम इसे स्वयं हल करने का प्रयास देखना अच्छा होगा।
 – 
Heretic Monkey
25 फरवरी 2020, 01:17
मैं आपकी चाबियों का तर्क नहीं समझता। (1,100) और (6,104) दोनों के लिए 1 कुंजी कैसे है?
 – 
Victor Wilson
25 फरवरी 2020, 01:37
क्या होगा यदि आपके पास तीन डुप्लीकेट थे? यानी list.Add(new DataClass {Number1= 8, Number2 = 104}); भी
 – 
Enigmativity
25 फरवरी 2020, 02:12

3 जवाब

यह मेरे लिए अस्पष्ट है यदि आप उस स्थिति को संभालना चाहते हैं जहां आपके पास केवल एक डुप्लिकेट से अधिक हो सकता है (यानी तीन या अधिक समान Number2)। मैं एक और DataClass जोड़ूंगा ताकि आप देख सकें कि 2 से अधिक को कैसे संभालना है।

साथ ही, यह स्पष्ट नहीं है कि आप आउटपुट को (1) Dictionary<int, Dictionary<int, int>> या (2) Dictionary<int, List<DataClass>> होना चाहते हैं। मैं तुम्हें दोनों प्रदान करूंगा।

List<DataClass> list = new List<DataClass>()
{
    new DataClass { Number1 = 1, Number2 = 100 },
    new DataClass { Number1 = 2, Number2 = 100 },
    new DataClass { Number1 = 3, Number2 = 101 },
    new DataClass { Number1 = 4, Number2 = 102 },
    new DataClass { Number1 = 5, Number2 = 103 },
    new DataClass { Number1 = 6, Number2 = 104 },
    new DataClass { Number1 = 7, Number2 = 104 },
    new DataClass { Number1 = 8, Number2 = 104 },
};

(1)

Dictionary<int, Dictionary<int, int>> result =
    list
        .ToLookup(x => x.Number2)
        .SelectMany(xs => xs.Select((x, i) => new { x.Number1, x.Number2, i }))
        .GroupBy(x => x.i)
        .ToDictionary(
            gxs => gxs.Key + 1,
            gxs => gxs.ToDictionary(x => x.Number1, x => x.Number2));

(2)

Dictionary<int, List<DataClass>> result =
    list
        .ToLookup(x => x.Number2)
        .SelectMany(xs => xs.Select((v, i) => new { v, i }))
        .GroupBy(x => x.i, x => x.v)
        .ToDictionary(
            gxs => gxs.Key + 1,
            gxs => gxs.ToList());

मुझे (2) से प्राप्त आउटपुट है:

result 2

1
Enigmativity 25 फरवरी 2020, 02:35
जी बहुत बहुत शुक्रिया। जैसा मुझे चाहिए था यह बिल्कुल वैसा ही है।
 – 
Song
25 फरवरी 2020, 02:54
List<DataClass> list = new List<DataClass>();
list.Add(new DataClass { Number1 = 1, Number2 = 100 });
list.Add(new DataClass { Number1 = 2, Number2 = 100 });
list.Add(new DataClass { Number1 = 3, Number2 = 101 });
list.Add(new DataClass { Number1 = 4, Number2 = 102 });
list.Add(new DataClass { Number1 = 5, Number2 = 103 });
list.Add(new DataClass { Number1 = 6, Number2 = 104 });
list.Add(new DataClass { Number1 = 7, Number2 = 104 });

var unique = new Dictionary<int, DataClass>();
var repeated = new List<DataClass>();
var result = new Dictionary<int, IEnumerable<DataClass>>();

foreach (var obj in list)
    if (!unique.TryAdd(obj.Number2, obj))
        repeated.Add(obj);

result.Add(1, unique.Values);
result.Add(2, repeated);
0
thiago mendes 25 फरवरी 2020, 01:29
        List<DataClass> list = new List<DataClass>();
        list.Add(new DataClass {Number1= 1, Number2 = 100});
        list.Add(new DataClass {Number1= 2, Number2 = 100});
        list.Add(new DataClass {Number1= 3, Number2 = 101});
        list.Add(new DataClass {Number1= 4, Number2 = 102});
        list.Add(new DataClass {Number1= 5, Number2 = 103});
        list.Add(new DataClass {Number1= 6, Number2 = 104});
        list.Add(new DataClass {Number1= 7, Number2 = 104}); 
        var outPut = SplittedOutPut(list); 

private static Dictionary<int,IList<DataClass>> SplittedOutPut(IList<DataClass> fullList)
 {
      List<DataClass> Number1 = new List<DataClass>();
      List<DataClass> Number2 = new List<DataClass>();
      foreach (DataClass item in fullList)
      {
        if(!Number1.Exists( _ => _.Number2 == item.Number2))
            Number1.Add(item);
        else
            Number2.Add(item); 
      }

    var output = new Dictionary<int, IList<DataClass>>();
    outPut.Add(1,Number1);
    outPut.Add(2,Number2);
    return output;
  }

साइड नोट: कोई इसके लिए C# GroupBy Linq क्लॉज का उपयोग करने के बारे में सोच सकता है, लेकिन मैं केवल यह बताना चाहता हूं कि LINQ ग्रुप-बाय SQL ग्रुप-बाय के समान नहीं है। एक SQL समूह-द्वारा केवल परिणाम के रूप में समूहीकरण कुंजी उत्पन्न करता है। एक LINQ समूह-दर एक पदानुक्रमित क्वेरी है जो समूहों का एक क्रम देता है, जहाँ प्रत्येक समूह में कुंजी और समूह बनाने वाले सभी तत्व (पंक्तियाँ) होते हैं। इस प्रकार यह केवल एक सूची का पता लगाने की तुलना में बहुत अधिक महंगी क्वेरी होगी, जिसे मैंने ऊपर चित्रित किया है।

0
yido 25 फरवरी 2020, 02:22