HiveBrain v1.2.0
Get Started
← Back to all entries
patterncsharpMinor

comparing objects; optimize code short of using reflection

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
reflectioncomparingobjectsshortoptimizeusingcode

Problem

I'm comparing two distinct instances and if they are not the same I save to the dB, so I've given snippet of code below of the way I am comparing these instances, I realize I could use reflection and generalize but short of using reflections is there any other way I could optimize the code or make it neater?

```
public class QuestionModel
{

private string _selectedId = string.Empty;
public string SelectedId
{
get { return _selectedId; } set { _selectedId = value; }
}

private List _userResponse;
public List UserResponses
{
get { return _userResponse ?? (_userResponse = new List()); }
set { _userResponse = value; }
}

}

public class UserResponseModel
{
public string QuestionId { get; set; }
public string QuestionText { get; set; }
public bool IsChecked { get; set; }

public int? Value { get; set; }
public string TextValue { get; set; }
public Byte[] Content { get; set; }
public string FilePath { get; set; }

public int? Points { get; set; }
public int? InputType { get; set; }

public bool? IsCheckedRadioButton1 { get; set; }
public bool? IsCheckedRadioButton2 { get; set; }
public bool? IsCheckedRadioButton3 { get; set; }
public bool? IsCheckedRadioButton4 { get; set; }
public bool? IsCheckedRadioButton5 { get; set; }

public bool IsCheckedCheckbox1 { get; set; }
public bool IsCheckedCheckbox2 { get; set; }

private string _selectedId = string.Empty;
public string SelectedId
{
get { return _selectedId; }
set { _selectedId = value; }
}

}

//snippet of code that compares instances of QuestionModel

QuestionModel questionModelInDb = null;

if (existingResponsesInDb.Any())
questionModelInDb = UtilityFunctions.MapResponsestoUserResponses(existingResponsesInDb);

if (questionModelInDb == null) return false;

var isSame = questionModelInDb.SelectedId

Solution

If you want to compare two Lists, you can use Enumerable.SequenceEqual

public class UserResponseModelComparer : IEqualityComparer {

    public bool Equals(UserResponseModel userResponse1, UserResponseModel userResponse2) {
        //... compare the two responses
    }

    public int GetHashCode(UserResponseModel userResponse) {
        // .. calculate hash code... 
        // see guidelines here: 
        // http://stackoverflow.com/questions/462451/gethashcode-guidelines-in-c-sharp
    }
}

return Enumerable.SequenceEqual(questionModel.UserResponses, 
                                questionModelInDb.UserResponses, 
                                new UserResponseModelComparer());

Code Snippets

public class UserResponseModelComparer : IEqualityComparer<UserResponseModel> {

    public bool Equals(UserResponseModel userResponse1, UserResponseModel userResponse2) {
        //... compare the two responses
    }

    public int GetHashCode(UserResponseModel userResponse) {
        // .. calculate hash code... 
        // see guidelines here: 
        // http://stackoverflow.com/questions/462451/gethashcode-guidelines-in-c-sharp
    }
}

return Enumerable.SequenceEqual(questionModel.UserResponses, 
                                questionModelInDb.UserResponses, 
                                new UserResponseModelComparer());

Context

StackExchange Code Review Q#43577, answer score: 4

Revisions (0)

No revisions yet.