Сравнение между тремя членами объекта - PullRequest
0 голосов
/ 05 февраля 2020

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

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 для этого? Есть ли "лучшее" решение?

Ответы [ 3 ]

3 голосов
/ 05 февраля 2020

Вместо создания 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 метод

1 голос
/ 05 февраля 2020

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

Он должен выполнять итерации по ним, и когда один из них не возвращает значение 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 голос
/ 05 февраля 2020

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

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. Если какое-либо из этих сравнений отличается от первого сравнения *, мы знаем, что у нас разные результаты.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...