Сравните два объекта Массива.NET

Используйте Array#map , Array#reduce и Array#join , чтобы окружить элементы внутреннего массива требуемыми тегами HTML, а затем уплотнить в одну строку. В настоящее время у вас есть неявный вызов Array#toString , который создает разделенную запятыми строку элементов внутреннего массива (внутренний массив в teamData[i]), и, таким образом, у вас есть только одна ячейка в ваших предыдущих попытках выходной.

Эта простая функция предполагает, что вы не применяете какие-либо стили или атрибуты, специфичные для столбцов или строк, поэтому она может просто одинаково обрабатывать каждый элемент . Если у вас есть симметричный стиль для применения, вам нужно сначала обработать заголовки / переменные строки с помощью .map (поскольку затем вы можете использовать индексы элементов), а затем .join("") вместо простого .join с использованием разделителей тегов.

function getTableHTMLFrom(array, hasHeaders) {
  if (!array || !array.length || !array[0].length)
    return "";

  const headerString = (hasHeaders ?
    "" + array.shift().join("") + ""
    : "");

  const tdTag = "";
  const bodyString = array.reduce(function (s, row) {
    s += "" + tdTag + row.join("" + tdTag) + "";
    return s;
  }, "");
  return "" + headerString + bodyString + "
"; }

25
задан Peter Mortensen 29 June 2015 в 00:01
поделиться

3 ответа

Подход Kathy кажется хорошим мне. Я лично позволил бы компаратору быть указанным явно:

bool AreEqual<T>(T[] a, T[] b)
{
    return AreEqual(a, b, EqualityComparer<T>.Default);
}

bool AreEqual<T>(T[] a, T[] b, IEqualityComparer<T> comparer)
{
    // Handle identity comparison, including comparing nulls
    if (a == b)
    {
        return true;
    }

    if (a == null || b == null)
    {
        return false;
    }

    if(a.Length != b.Length)
    {
        return false;
    }

    for(int i = 0; i < a.Length; i++)
    {
        if(!comparer.Equals(a[i], b[i]))
        {
            return false;
        }
    }
    return true;
}

SequenceEqual, как упомянуто CMS хорош, но из-за его общности более чем IEnumerable<T> я не думаю, что он может убрать "раннее", если длина не равна. (Возможно, что это проверяет на обе последовательности, реализовывая IList хотя, для проверки количества непосредственно.) Вы могли сделать вывод немного больше, для использования IList<T>

bool AreEqual<T>(IList<T> a, IList<T> b, IEqualityComparer<T> comparer)
{
    if(a.Count != b.Count)
    {
        return false;
    }
    for(int i = 0; i < a.Count; i++)
    {
        if(!comparer.Equals(a[i], b[i]))
        {
            return false;
        }
    }
    return true;
}

, прямая версия массива, вероятно, будет самой эффективной - добавляющая общность и абстракция обычно поражают производительность, хотя, является ли это значительным , будет зависеть от приложения.

18
ответ дан Jon Skeet 28 November 2019 в 18:03
поделиться

Вы могли использовать SequenceEqual:

string[] a = { "1", "2", "3" };
string[] b = { "1", "2", "3" };

bool areEqual = a.SequenceEqual(b); // true


string[] c = { "1", "2", "5" };
areEqual = a.SequenceEqual(c);      // false
48
ответ дан CMS 28 November 2019 в 18:03
поделиться

Возможно, что-то вроде этого?

static bool AreEqual<T>(T[] a, T[] b) 
{
    bool areEqual = false ;
    T[] result = a.Intersect(b.AsEnumerable()).ToArray();
    areEqual = (result.Length == a.Length) && (result.Length == b.Length);
    return areEqual;
}

я не уверен в производительности, пораженной в этого все же.

РЕДАКТИРОВАНИЕ

исправленная версия, принимающая во внимание предложения Jon:

    static bool AreEqual<T>(T[] a, T[] b) 
    {
        return a.SequenceEqual(b);
    }
0
ответ дан Igor Zelaya 28 November 2019 в 18:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: