ছেদ বিপরীতে ()


275

দুটি সংগ্রহের মধ্যে ম্যাচগুলি খুঁজতে ইন্টারসেক্ট ব্যবহার করা যেতে পারে, যেমন:

// Assign two arrays.
int[] array1 = { 1, 2, 3 };
int[] array2 = { 2, 3, 4 };
// Call Intersect extension method.
var intersect = array1.Intersect(array2);
// Write intersection to screen.
foreach (int value in intersect)
{
    Console.WriteLine(value); // Output: 2, 3
}

তবে আমি যা অর্জন করতে চাই তার বিপরীত, আমি অন্য সংগ্রহ থেকে নিখোঁজ থাকা একটি সংগ্রহের আইটেমগুলি তালিকাবদ্ধ করতে চাই :

// Assign two arrays.
int[] array1 = { 1, 2, 3 };
int[] array2 = { 2, 3, 4 };
// Call "NonIntersect" extension method.
var intersect = array1.NonIntersect(array2); // I've made up the NonIntersect method
// Write intersection to screen.
foreach (int value in intersect)
{
    Console.WriteLine(value); // Output: 4
}

13
আপনি যদি আউটপুট হিসাবে 4, বা 1 এবং 4
indyvind ব্রাথিন

@ ওভিন্দ-নোব্লোক-ব্র্যাথেন হ্যাঁ, আমি কেবল চাই 4
পিটার ব্রিজার

23
পার্শ্ব নোট হিসাবে, এই ধরণের সেটকে একটি প্রতিসম পার্থক্য বলা হয় ।
মাইক টি

19
প্রযুক্তিগতভাবে বলতে গেলে, একটি প্রতিসম পার্থক্যের ফলাফল [1, 4] এ আসবে। যেহেতু পিটার কেবল অ্যারে 2 তে উপাদানগুলি চেয়েছিলেন যা অ্যারে 1 তে নেই (অর্থাত্ 4), সেটিকে একটি আপেক্ষিক পরিপূরক বলা হয় (ওরফে সেট-তাত্ত্বিক পার্থক্য)
রটার্স

উত্তর:


376

যেমন বলা হয়েছে, ফলাফল হিসাবে 4 পেতে চাইলে আপনি এটি করতে পারেন:

var nonintersect = array2.Except(array1);

আপনি যদি আসল অ-ছেদটি চান (তবে 1 এবং 4 উভয়ই), তবে এই কৌশলটি করা উচিত:

var nonintersect = array1.Except(array2).Union( array2.Except(array1));

এটি সর্বাধিক পারফরম্যান্ট সমাধান হবে না তবে ছোট তালিকার জন্য এটি ঠিক কাজ করা উচিত।


2
এর চেয়ে ভাল পারফরম্যান্স সমাধান কী হবে? ধন্যবাদ!
শানাবস

6
লুপের জন্য দু'টি নেস্টেড ব্যবহার করে আপনি সম্ভবত এটি আরও দ্রুত করতে পারেন তবে কোডটি এর থেকে আরও সুগন্ধযুক্ত হবে। এটিতে পঠনযোগ্যতা গণনা করা, আমি পরিষ্কারভাবে এই বৈকল্পিকটি ব্যবহার করব কারণ এটি পড়া খুব সহজ।
vyvind ব্রাথিন

5
যোগ করার জন্য কেবল একটি পক্ষের পয়েন্ট, যদি আপনার কাছে থাকে: int [] এর আগে = {1, 2, 3}; int [] = = {2, 3, 3, 4} পরে; এবং আপনি 'এর পরে' এর আগে 'এর আগে' যুক্ত হয়েছে কি তা খুঁজে বের করার ব্যতীত ব্যবহার করার চেষ্টা করুন: var diff = after.Ecepcept (এর আগে); 'ডিফ'-এ 4,4 থাকে না 3,4। অর্থাত্ আপনাকে অনাকাঙ্ক্ষিত ফলাফল দেওয়ার জন্য সদৃশ উপাদানগুলির জন্য সজাগ রাখুন
পল রাইল্যান্ড

এটি কি আরও ভাল পারফর্ম করবে? array1.AddRange (array2.Except (বিন্যাস 1));
এলবিডাব্লু

86

তুমি ব্যবহার করতে পার

a.Except(b).Union(b.Except(a));

অথবা আপনি ব্যবহার করতে পারেন

var difference = new HashSet(a);
difference.SymmetricExceptWith(b);

2
প্রতিসামগ্রী এক্সসেপ্টউইট () এর আকর্ষণীয় ব্যবহার, আমি সেই পদ্ধতির কথা ভাবিনি
পিটার ব্রিজার

SymmetricExceptWithসম্ভবত আমার প্রিয় পদ্ধতি।
অ্যাশ ক্লার্ক

6
আমি দুটিকে একটি বাস্তব প্রয়োগের সাথে তুলনা করেছি যেখানে আমি তাদের প্রত্যেকের মধ্যে প্রায় 125 টি স্ট্রিংয়ের একটি দম্পতি তালিকা ছিল। প্রথম পদ্ধতির ব্যবহারটি সেই আকারের তালিকার জন্য আসলে দ্রুততর, যদিও এটি উভয় পদ্ধতির হিসাবে অর্ধ মিলি সেকেন্ডের নীচে বেশিরভাগই তুচ্ছ।
ড্যান

1
ছাত্রলীগের যদি এর জন্য একটি লিনক এক্সটেনশন পদ্ধতি থাকে তবে ভাল লাগবে। মনে হচ্ছে যেন বাদ পড়েছে।
ড্রয় নোকস


11

এই কোডটি প্রতিটি ক্রমকে কেবল একবার গণনা করে এবং Select(x => x)পরিষ্কার লিনক-স্টাইলের এক্সটেনশন পদ্ধতিটি পেতে ফলাফলটি গোপন করতে ব্যবহার করে। যেহেতু HashSet<T>এটির রানটাইম ব্যবহার করে O(n + m)তা হ্যাশগুলি ভালভাবে বিতরণ করা হয়। উভয় তালিকার সদৃশ উপাদান বাদ দেওয়া হয়েছে।

public static IEnumerable<T> SymmetricExcept<T>(this IEnumerable<T> seq1,
    IEnumerable<T> seq2)
{
    HashSet<T> hashSet = new HashSet<T>(seq1);
    hashSet.SymmetricExceptWith(seq2);
    return hashSet.Select(x => x);
}

6

আমি মনে করি আপনি খুঁজছেন হতে পারে Except:

বাদে অপারেটর দুটি অনুক্রমের মধ্যে সেট পার্থক্য তৈরি করে produces এটি কেবলমাত্র প্রথম ক্রমে উপাদানগুলি ফেরত দেবে যা দ্বিতীয়টিতে প্রদর্শিত হবে না। আপনি equalityচ্ছিকভাবে আপনার নিজস্ব সমতা তুলনা ফাংশন সরবরাহ করতে পারেন।

পরীক্ষা করে দেখুন এই লিঙ্কে , এই লিঙ্কে , বা Google, আরও তথ্যের জন্য।


2

আপনার নন-আন্তঃস্রেক্ট পদ্ধতিটি যা করার কথা বলেছি তা আমি 100% নিশ্চিত নই (সেট থিউরি সম্পর্কিত) - এটি
বি \ এ (বি থেকে সমস্ত কিছু যা এ-তে ঘটে না)?
যদি হ্যাঁ, তবে আপনি ব্যাতিক্রম অপারেশন (B.Except (A)) ব্যবহার করতে সক্ষম হবেন।


সেট == A∪B \ A∩B ছেদ
amuliar

2
/// <summary>
/// Given two list, compare and extract differences
/// http://stackoverflow.com/questions/5620266/the-opposite-of-intersect
/// </summary>
public class CompareList
{
    /// <summary>
    /// Returns list of items that are in initial but not in final list.
    /// </summary>
    /// <param name="listA"></param>
    /// <param name="listB"></param>
    /// <returns></returns>
    public static IEnumerable<string> NonIntersect(
        List<string> initial, List<string> final)
    {
        //subtracts the content of initial from final
        //assumes that final.length < initial.length
        return initial.Except(final);
    }

    /// <summary>
    /// Returns the symmetric difference between the two list.
    /// http://en.wikipedia.org/wiki/Symmetric_difference
    /// </summary>
    /// <param name="initial"></param>
    /// <param name="final"></param>
    /// <returns></returns>
    public static IEnumerable<string> SymmetricDifference(
        List<string> initial, List<string> final)
    {
        IEnumerable<string> setA = NonIntersect(final, initial);
        IEnumerable<string> setB = NonIntersect(initial, final);
        // sum and return the two set.
        return setA.Concat(setB);
    }
}

2

array1.NonIntersect (বিন্যাস 2);

আপনার যে করণীয় উচিত লিনক-তে এই ধরনের অপারেটর উপস্থিত নেই

-> ইউনিয়ন -> বাদে

a.except(b).union(b.Except(a));

-1
string left = "411329_SOFT_MAC_GREEN";
string right= "SOFT_MAC_GREEN";

string[] l = left.Split('_');
string[] r = right.Split('_');

string[] distinctLeft = l.Distinct().ToArray();
string[] distinctRight = r.Distinct().ToArray();

var commonWord = l.Except(r, StringComparer.OrdinalIgnoreCase)
string result = String.Join("_",commonWord);
result = "411329"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.