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

Minimize code in c#

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

Problem

var newObject = keyValuePair.Key;
var originalObject = keyValuePair.Value;
List bitValues = new List();
foreach (var item in originalObject.ChargeBITValues)
{
    ChargeBITValue bitValue = new ChargeBITValue()
    {
        ChargeTypeEnumID = item.ChargeTypeEnumID,
        DataValue = item.DataValue,
        ClientTripTypeContractChargeValueList = newObject
    };
    bitValues.Add(bitValue);
}


I have similar loops for rest of the values, bitValues, moneyValues, Rupees Values, how can I remove the duplication from my code?

Solution

First, if you don't have it already, you need to define a common Interface that is implemented by ChargeBITValue, ChargeMoneyValue, ChargeRupeeValue etc (you need to adapt the interface using the actual types of your properties instead of int, List and IEnumerable). Let' call it IChargeValue:

interface IChargeValue
{
    int ChargeTypeEnumID { get; set; }
    int DataValue { get; set; }
    List ClientTripTypeContractChargeValueList { get; set; }
    IEnumerable ChargeValues { get; }
}


Then, you change your method to use generics and type constraints:

private void YourMethod() where T : IChargeValue, new()
{
    // KeyValuePair keyValuePair = new ...
    var newObject = keyValuePair.Key;
    var originalObject = keyValuePair.Value;
    List values = new List();
    foreach (var item in originalObject.ChargeValues)
    {
        T value = new T()
        {
            ChargeTypeEnumID = item.ChargeTypeEnumID,
            DataValue = item.DataValue,
            ClientTripTypeContractChargeValueList = newObject
        };
        values.Add(value);
    }
}


If you want to, you can use LINQ instead of the foreach statement:

var values =
    from item in originalObject.ChargeValues
    select new T
    {
        ChargeTypeEnumID = item.ChargeTypeEnumID,
        DataValue = item.DataValue,
        ClientTripTypeContractChargeValueList = newObject
    };
List valuesAsList = values.ToList();

Code Snippets

interface IChargeValue
{
    int ChargeTypeEnumID { get; set; }
    int DataValue { get; set; }
    List<string> ClientTripTypeContractChargeValueList { get; set; }
    IEnumerable<IChargeValue> ChargeValues { get; }
}
private void YourMethod<T>() where T : IChargeValue, new()
{
    // KeyValuePair<YourTKey, YourTValue> keyValuePair = new ...
    var newObject = keyValuePair.Key;
    var originalObject = keyValuePair.Value;
    List<T> values = new List<T>();
    foreach (var item in originalObject.ChargeValues)
    {
        T value = new T()
        {
            ChargeTypeEnumID = item.ChargeTypeEnumID,
            DataValue = item.DataValue,
            ClientTripTypeContractChargeValueList = newObject
        };
        values.Add(value);
    }
}
var values =
    from item in originalObject.ChargeValues
    select new T
    {
        ChargeTypeEnumID = item.ChargeTypeEnumID,
        DataValue = item.DataValue,
        ClientTripTypeContractChargeValueList = newObject
    };
List<T> valuesAsList = values.ToList();

Context

StackExchange Code Review Q#7154, answer score: 6

Revisions (0)

No revisions yet.