سؤال

ولدي مجموعة من المصفوفات - معلومات حول التحديد في Excel باستخدام VSTO، حيث يعني كل عنصر بدء وموقف اختيار نهاية

وعلى سبيل المثال،

int[][] selection = {
new int[] { 1 }, // column A
new int[] { 6 }, // column F
new int[] { 6 }, // column F
new int[] { 8, 9 } // columns H:I
new int[] { 8, 9 } // columns H:I
new int[] { 12, 15 } // columns L:O
};

وأرجو مساعدتي لايجاد وسيلة، ربما باستخدام أساليب LINQ أو التمديد، لإزالة العناصر المكررة؟ أعني: F وF، H:I وH:I، الخ

.
هل كانت مفيدة؟

المحلول

إذا كنت ترغب في استخدام الحل LINQ / طريقة تمديد النقي، ثم ستحتاج إلى تحديد تنفيذ الخاص بك من IEqualityComparer للصفائف / متواليات. (إلا إذا أنا في عداد المفقودين شيء واضح، وليس هناك مجموعة أو تسلسل المقارن موجودة من قبل في BCL). هذا ليس من الصعب بشكل رهيب ولكن - وهنا مثال واحد التي ينبغي القيام بهذه المهمة بشكل جيد:

public class SequenceEqualityComparer<T> : IEqualityComparer<IEnumerable<T>>
{
    public bool Equals(IEnumerable<T> x, IEnumerable<T> y)
    {
        return Enumerable.SequenceEqual(x, y);
    }

    // Probably not the best hash function for an ordered list, but it should do the job in most cases.
    public int GetHashCode(IEnumerable<T> obj)
    {
        int hash = 0;
        int i = 0;
        foreach (var element in obj)
            hash = unchecked((hash * 37 + hash) + (element.GetHashCode() << (i++ % 16)));
        return hash;
    }
}

وميزة هذا هو أنه يمكنك ثم ببساطة الاتصال التالية لإزالة أي صفائف مكررة.

var result = selection.Distinct(new SequenceEqualityComparer<int>()).ToArray();

وعلى أمل أن يساعد.

نصائح أخرى

أولا تحتاج إلى وسيلة لمقارنة صفائف عدد صحيح. لاستخدامه مع الفئات في الإطار، يمكنك أن تفعل ذلك بجعل EquailtyComparer. إذا يتم فرز المصفوفات دائما، وهذا هو السهل بدلا من تنفيذ:

public class IntArrayComparer : IEqualityComparer<int[]> {

    public bool Equals(int[] x, int[] y) {
        if (x.Length != y.Length) return false;
        for (int i = 0; i < x.Length; i++) {
            if (x[i] != y[i]) return false;
        }
        return true;
    }

    public int GetHashCode(int[] obj) {
        int code = 0;
        foreach (int value in obj) code ^= value;
        return code;
    }

}

والآن يمكنك استخدام صفيف عدد صحيح كمفتاح في HashSet للحصول على المصفوفات فريدة من نوعها:

int[][] selection = {
    new int[] { 1 }, // column A
    new int[] { 6 }, // column F
    new int[] { 6 }, // column F
    new int[] { 8, 9 }, // columns H:I
    new int[] { 8, 9 }, // columns H:I
    new int[] { 12, 15 } // columns L:O
};

HashSet<int[]> arrays = new HashSet<int[]>(new IntArrayComparer());
foreach (int[] array in selection) {
    arrays.Add(array);
}

ووHashSet رميات فقط بعيدا القيم المكررة، لذلك يحتوي الآن على أربعة صفائف عدد صحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top