मेरे पास कक्षा की एक सूची है:

class GroupAssets
    {
        public string Name { get; set; }
        public List<string> Assets { get; set; }
    }

        List<GroupAssets> GroupList2 = new List<GroupAssets>{
                new GroupAssets { Name="Group1", Assets = new List<string>{ "A","B","C","D" }},
                new GroupAssets { Name="Group1", Assets = new List<string>{ "A","B","E","F" }},
                new GroupAssets { Name="Group3", Assets = new List<string>{ "A","B","H","G" }},
                new GroupAssets { Name="Group4", Assets = new List<string>{ "A","I","C","J" }}
    };

मैं डुप्लिकेट को हटाना चाहता हूं और यह परिणाम प्राप्त करना चाहता हूं:

Group1 => D
Group2 => E,F
Group3 => H,G
Group4 => I,J
Duplicate => A,B,C

आपके सहयोग के लिए धन्यवाद

0
Fedo 14 जिंदा 2022, 17:16
जो कुछ भी पोस्ट किया गया है वह एक प्रोग्राम विवरण है, लेकिन यह हमें यह नहीं बताता कि आपको क्या समस्या हो रही है। आपने क्या प्रयास किया है, और आपको किन परेशानियों का सामना करना पड़ा? कृपया एक संपादित करें करें। >वैध प्रश्न जिसका हम उत्तर दे सकते हैं। रिमाइंडर: सुनिश्चित करें कि आप जानते हैं कि ऑन-टॉपिक क्या है; हमें आपके लिए कार्यक्रम लिखने के लिए कहना, सुझाव और बाहरी लिंक विषय से परे हैं।
 – 
gunr2171
14 जिंदा 2022, 17:17
1
तो मुझे लगता है कि आपकी सूची नई सूची है <स्ट्रिंग> {"ए", "बी", "सी", "डी"}? और आपके पास समूह 1 के बजाय समूह 2 है? क्या आप कृपया अपनी त्रुटियों को ठीक कर सकते हैं
 – 
Frenchy
14 जिंदा 2022, 17:28

4 जवाब

         List<GroupAssets> GroupList = new List<GroupAssets>{ 
                    new GroupAssets { Name="Group1", Assets = new List<string>{ "A","B","C","D" }},
                    new GroupAssets { Name="Group1", Assets = new List<string>{ "A","B","E","F" }},
                    new GroupAssets { Name="Group3", Assets = new List<string>{ "A","B","H","G" }},
                    new GroupAssets { Name="Group4", Assets = new List<string>{ "A","I","C","J" }}
        };
    var assetList = new Dictionary<string,int>();
    foreach (var g in GroupList.Select(x=> x.Assets)) {
         g.ForEach(x=> {
             if (!assetList.ContainsKey(x)) assetList.Add(x,1);
             else assetList[x]++;
         });
    }

    var nonUnique = assetList.Where(x=> x.Value > 1).Select(x=> x.Key).ToList();
    nonUnique.ForEach(x=> { Console.WriteLine(x); });

वैकल्पिक समाधान यदि आप डुप्लिकेट की कुल राशि जानना चाहते हैं

0
danny b 14 जिंदा 2022, 17:37

आप इस दृष्टिकोण का उपयोग कर सकते हैं:

HashSet<string> allUnique = new HashSet<string>();
HashSet<string> duplicates = new HashSet<string>();
foreach (string s in GroupList.SelectMany(ga => ga.Assets.SelectMany(a => a.Split(','))))
{
    if (!allUnique.Add(s)) duplicates.Add(s);
}

foreach (GroupAssets ga in GroupList)
{
    for (int i = 0; i < ga.Assets.Count; i++)
    {
        ga.Assets[i] = string.Join(",", ga.Assets[i].Split(',').Except(duplicates));
    }
}

लेकिन आप एक स्ट्रिंग को एक सूची में क्यों स्टोर करते हैं जिसमें एकाधिक अल्पविराम से अलग मान होते हैं? लगता है जैसे उन्हें अलग से संपत्ति सूची में स्टोर करना चाहिए।

0
Tim Schmelter 14 जिंदा 2022, 17:50

यह मानते हुए कि आपके पास है

List<GroupAssets> GroupList = new List<GroupAssets>{
  new GroupAssets { Name="Group1", Assets = new List<string>{ "A" ,"B", "C", "D" }},
  new GroupAssets { Name="Group2", Assets = new List<string>{ "A" ,"B", "E", "F" }},
  new GroupAssets { Name="Group3", Assets = new List<string>{ "A" ,"B", "H", "G" }},
  new GroupAssets { Name="Group4", Assets = new List<string>{ "A" ,"I", "C", "J" }},
};

ध्यान दें, कि प्रत्येक Asset में 4 आइटम हैं (1 नहीं) जिन्हें आप डाल सकते हैं

कोड:

HashSet<string> duplicates = new HashSet<string>();
HashSet<string> all = new HashSet<string>();

foreach (var item in GroupList)
  foreach (var asset in item.Assets) 
    if (!all.Add(asset))     // duplicate if all contains the asset
      duplicates.Add(asset);

// removing duplicates from each Asset
foreach (var item in GroupList)
  item.Assets.RemoveAll(item => duplicates.Contains(item));

आइए एक नजर डालते हैं:

string report = string.Join(Environment.NewLine, GroupList
  .Select(item => $"{item.Name} => {string.Join(", ", item.Assets)}"));

Console.WriteLine(report);

Console.WriteLine("Duplicate => {string.Join(", ", duplicates)}");

परिणाम:

Group1 => D
Group2 => E, F
Group3 => H, G
Group4 => I, J
Duplicate => A, B, C

अगर, हालांकि, प्रत्येक Assets में 1 अल्पविराम से अलग किया गया आइटम है, तो आपको Split और Join जोड़ना चाहिए:

HashSet<string> duplicates = new HashSet<string>();
HashSet<string> all = new HashSet<string>();

foreach (var item in GroupList)
  foreach (var asset in item.Assets.SelectMany(list => list.Split(','))) 
    if (!all.Add(asset)) 
      duplicates.Add(asset);

foreach (var item in GroupList) {
  item.Assets = item
    .Assets
    .Select(asset => asset.Split(',').Where(c => !duplicates.Contains(c)))
    .Where(asset => asset.Any())
    .Select(asset => string.Join(",", asset))
    .ToList();
}
0
Dmitry Bychenko 14 जिंदा 2022, 17:53

मुझे लगता है कि आपने गलती की है और संपत्ति GroupAssets.Assets में संपत्तियों की सूची (new List<string>() {"A", "B"}) है और सूची में केवल एक स्ट्रिंग के साथ अल्पविराम से अलग तारों की सूची नहीं है (new List<string>() {"A,B"})।

सबसे पहले आपको यह पता लगाना होगा कि डुप्लिकेट क्या हैं। आप आइटम्स को "ए" से "जे" में से किसी एक स्ट्रिंग द्वारा समूहित कर सकते हैं और मान int सभी सूचियों में उस कुंजी की घटनाओं की संख्या है। हम एक और स्टैक ओवरफ़्लो प्रश्न से कोड लेते हैं, जिसे एक SelectMany के साथ बढ़ाया गया है क्योंकि हम कई सूचियों को एक में समतल करना चाहते हैं .

    var assetCount = GroupList
        .SelectMany(x => x.Assets)
        .GroupBy(x => x)
        .Select(s => new { Asset = s.Key, Count = s.Count() });

फिर हम डुप्लिकेट की सूची बनाते हैं, और अद्वितीय संपत्ति वाले समूहों की सूची बनाते हैं:

    var duplicates = assetCount.Where(x => x.Count > 1).Select(x => x.Asset).ToList();
    
    var uniqueAssetsGroupList = GroupList
        .Select(x => new GroupAssets() { Name = x.Name, Assets = x.Assets.Except(duplicates).ToList() });
    
    foreach (var group in uniqueAssetsGroupList)
        Console.WriteLine(string.Format("{0} => {1}", group.Name, string.Join(",", group.Assets)));

    Console.WriteLine("Duplicate => {0}", string.Join(",", duplicates));
0
Dialecticus 14 जिंदा 2022, 18:02
हाय डायलेक्टिकस, यह काम करता है! बहुत बहुत धन्यवाद! हां क्षमा करें, मैंने अपनी पोस्ट में सुधार की गई संपत्तियों की सूची में गलती की है। आपकी सहायता के लिए एक बार फिर से धन्यवाद :-)
 – 
Fedo
14 जिंदा 2022, 18:48