Рассмотрим объекты следующего типа:

public class MyObject
{
    // "defining" attributes
    private string member1;
    private string member2;
    private string member3;

    // other attributes
    private string member4;
    private string member5;

    // ctor
    public MyObject(){}

    public bool compare(MyObject that)
    {
       // compare this object with another (that)
    }

Метод compare() должен вести себя следующим образом. Он рассматривает только «определяющие» атрибуты. Если они все различаются между двумя объектами, он должен вернуть false. Если они все одинаковы, верните false. В других случаях верните true (если только один или два из них отличаются между двумя объектами).

Вопрос в том, должен ли я прибегнуть к огромному if утверждению для этого? Есть ли лучшее решение?

0
Al2110 5 Фев 2020 в 08:57

3 ответа

Лучший ответ

Вместо создания n количества строк вы можете создать свойства с именами List<string> DefiningAttributes и List<string> OtherAttributes.

Теперь добавьте значения в эти списки, где вы хотите, а пока я делаю это в конструкторе. Используйте метод Except(), чтобы получить разницу от DefiningAttributes и OtherAttributes

Проверьте ниже реализации

public class MyObject
{
    // "defining" attributes
    public List<string> DefiningAttributes { get; set; }

    // other attributes
    public List<string> OtherAttributes { get; set; }

    public MyObject()
    {
        //I used constructor to assign values
        DefiningAttributes = new List<string>() { "ABC",  "PQR",  "XYZ" };
        OtherAttributes = new List<string>() { "ABC",  "PQR",  "Stackoverflow" };
    }

    public bool compare(MyObject that)
    {
         var difference = this.DefiningAttributes.Except(that.DefiningAttributes);
         //Return false If they are all different between two objects OR if they are all same
         if(difference.Count() == this.DefiningAttributes.Count() || !difference.Any())
                return false;

          //Otherwise return true
          return true;
    }
}

Подробнее читайте в Enumerable .Except метод

3
Prasad Telkikar 5 Фев 2020 в 07:09

Следующий код должен сделать свое дело. Если вы хотите увеличить количество определяющих свойств, просто измените размер массива или поменяйте его местами в список.

Он должен перебирать их, и когда он не совпадает, возвращать true. Если в конце ни одно совпадение не возвращает false.

public class MyObject
{

    // "defining" attributes
    public string[] definingAttributes = new string[3];

    // other attributes
    private string member4;
    private string member5;

    // ctor
    public MyObject() { }

    public bool compare(MyObject that)
    {
        bool? previousResult = null;
        // compare this object with another (that)
        for (int i = 0; i < definingAttributes.Length; i++)
        {
            if (previousResult == null)
            {
                previousResult = definingAttributes[i] == that.definingAttributes[i];
            }
            if (definingAttributes[i] != that.definingAttributes[i])
            {
                if (previousResult != (definingAttributes[i] == that.definingAttributes[i]))
                {
                    return true;
                }
            }
        }
        return false;
    }
}
1
Mario Figueiredo 5 Фев 2020 в 06:44

Я думаю, что это должно сделать это

var comp1 = this.member1 == that.member1;
var comp2 = this.member2 == that.member2;
var comp3 = this.member3 == that.member3;

var comparisons = new List<string>() { comp2, comp3 };

return comparisons.Any(val => val != comp1 );

comp1, comp2 и comp3 будут bools. Если какое-либо из этих сравнений не совпадает с первым сравнением *, мы знаем, что у нас разные результаты.

[*] Вы можете использовать любую контрольную точку вместо первого сравнения

Редактировать . Ой, я подумал, что это вопрос javascript, но потом понял, что это C #. Я просто изменил свой ответ, чтобы использовать синтаксис C #, но идея та же. Для этого требуется метод расширения Linq Any.

1
ShamPooSham 5 Фев 2020 в 06:38