Сравните свойства в запросе, если они имеют одинаковое значение C # - PullRequest
2 голосов
/ 05 марта 2019

Я хочу сравнить, если свойства в запросе имеют одинаковое значение.У меня есть следующий JSON, который я использую для запроса через PostMan.

“request”:[ {
“Id”: “1234567”,
“Position”: “1”,
“IsSet”: true
},
{
“Id”: “1234587”,
“Position”: “1”,
“IsSet”: true
}, 
]

В коде я хочу сравнить, если свойства Position и IsSet имеют одинаковое значение foreach id в запросе.Если они не выдают ошибку.

public class Info
{
     public string Id {get; set;}
     public string Position {get; set;}
     public bool IsSet {get; set;}
}

У меня есть метод Validate для проверки этих свойств.

public class Validate(Info context)
{
    foreach (var item in context)
    {
        // what code should check this
    }
}

Ответы [ 3 ]

4 голосов
/ 05 марта 2019

Вы можете использовать LINQ Select и Distinct для этой цели.

Вот пример "Validate" метода.

List<Test> objs = new List<Test>()
    {
        new Test(){ Position = "random position 1", IsSet = true, Id = 123 },
        new Test(){ Position = "random position 2", IsSet = true, Id = 123 },
        new Test(){ Position = "random position 3", IsSet = true, Id = 123 }

    };

    if(objs.Count() > 1){
        var query = objs.Select(p => new { p.Id, p.IsSet }).Distinct();

        var allTheSame = query.Count() == 1;

        Console.WriteLine(allTheSame);
    }else{

        Console.WriteLine("Nothing To Compare Against");    
    }
}

Логика здесь состоит в том, чтобы проверить, есть ли ещечем 1 элемент в списке - просто мы знаем, что есть с чем сравнивать значения.

Если их несколько, выберите свойства, с которыми вы хотите сопоставить объекты, и вызовите для них различные элементы.

Затем мы получаем количество различных значений, если они все совпадают, мы всегда получим 1, возвращенную из query.Count(), следовательно, логическую проверку.

В этот момент, если allTheSame равно false, вы можетевыведите свою ошибку вместо Console.WriteLine

Во втором Console.WriteLine вы всегда можете вернуть true, так как не с чем сравнивать, делая его достаточно отчетливым.

Вот пример dotNetFiddle .

2 голосов
/ 05 марта 2019

Вы можете просто пройтись по списку в вашем методе валидации с помощью вложенного цикла.Предполагая, что это IEnumerable в виде массива или списка, вы можете сделать следующее:

// not a class, context is IEnumerable, not a single entitry
// Returns true if OK, false if any element is not the same.
// 'Sameness' (equality) defined in Info-class as implemented by IEquatable
public bool Validate(IEnumerable<Info> context)
{
    for (int i = 0; i < context.Count(); i++)
    {
        for (int j = i + 1; j < context.Count(); j++)
        {
            if (!context[i].Equals(context[j])) {return false;}
        }
    }
    return true;
}

и Info с IEquatable

public class Info : IEquatable<Info>
{
    protected bool Equals(Info other)
    {
        return string.Equals(Id, other.Id) && string.Equals(Position, other.Position) && IsSet == other.IsSet;
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != this.GetType()) return false;
        return Equals((Info) obj);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            var hashCode = (Id != null ? Id.GetHashCode() : 0);
            hashCode = (hashCode * 397) ^ (Position != null ? Position.GetHashCode() : 0);
            hashCode = (hashCode * 397) ^ IsSet.GetHashCode();
            return hashCode;
        }
    }

    public string Id { get; set; }
    public string Position { get; set; }
    public bool IsSet { get; set; }
}

Если вы хотите, чтобы вы представилисьможет перегружать == и! = операторы вроде так:

public static bool operator ==(Info lhs, Info rhs) { return lhs.Equals(rhs); }
public static bool operator !=(Info lhs, Info rhs) { return !(lhs == rhs); }
2 голосов
/ 05 марта 2019

Мне нравится ответ Адриани6. Но это работает только с простыми классами. Лучшее решение, я думаю, это метод Equals. Вы можете легко сгенерировать его с помощью Resharper (Alt + insert, Equaliti members):

public class Info
    {
        protected bool Equals(Info other)
        {
            return string.Equals(Id, other.Id) && string.Equals(Position, other.Position) && IsSet == other.IsSet;
        }

        public override bool Equals(object obj)
        {
            if (ReferenceEquals(null, obj)) return false;
            if (ReferenceEquals(this, obj)) return true;
            if (obj.GetType() != this.GetType()) return false;
            return Equals((Info) obj);
        }

        public override int GetHashCode()
        {
            unchecked
            {
                var hashCode = (Id != null ? Id.GetHashCode() : 0);
                hashCode = (hashCode * 397) ^ (Position != null ? Position.GetHashCode() : 0);
                hashCode = (hashCode * 397) ^ IsSet.GetHashCode();
                return hashCode;
            }
        }

        public string Id { get; set; }
        public string Position { get; set; }
        public bool IsSet { get; set; }
    }
...