Упрощение метода toString() реализации


Любые идеи?

public override string ToString() {
    string returnValue;
    if (!string.IsNullOrWhiteSpace(Country))
        returnValue = string.Format("{0}", Country);
    else
        return returnValue;

    if (!string.IsNullOrWhiteSpace(City))
        returnValue += string.Format(", city {0}", City);
    else
        return returnValue;

    if (!string.IsNullOrWhiteSpace(Street))
        returnValue += string.Format(", street {0}", Street);
    else
        return returnValue;

    if (!string.IsNullOrWhiteSpace(Block))
        returnValue += string.Format(", block {0}", Block);
    else
        return returnValue;

    if (!string.IsNullOrWhiteSpace(Building))
        returnValue += string.Format(", building {0}", Building);



    if (!string.IsNullOrWhiteSpace(Latitude) 
             && !string.IsNullOrWhiteSpace(Longitude))
    returnValue += string.Format(", coordinates {0}:{1}", Latitude, Longitude);

    return returnValue;
}


550
6
задан 8 сентября 2011 в 11:09 Источник Поделиться
Комментарии
4 ответа

Я считаю, что это делает его более ремонтопригодным и относительно эффективным.

public class Information
{
public string Country { get; set; }
public string City { get; set; }
public string Street { get; set; }
public string Block { get; set; }
public string Building { get; set; }
public string Latitude { get; set; }
public string Longitude { get; set; }

private IEnumerable<Tuple<string[], string>> DataFormatPairs()
{
yield return Tuple.Create(new[] { Country }, "{0}");
yield return Tuple.Create(new[] { City }, "city {0}");
yield return Tuple.Create(new[] { Street }, "street {0}");
yield return Tuple.Create(new[] { Block }, "block {0}");
yield return Tuple.Create(new[] { Building }, "building {0}");
yield return Tuple.Create(new[] { Latitude, Longitude }, "coordinates {0}:{1}");
}
public override string ToString()
{
var data = DataFormatPairs()
.TakeWhile(p => p.Item1.All(s => !String.IsNullOrWhiteSpace(s)))
.Select(p => String.Format(p.Item2, p.Item1));
return String.Join(", ", data);
}
}

2
ответ дан 8 сентября 2011 в 06:09 Источник Поделиться

С помощью "&&" это остановит оценки на первые ложные, что-то вроде это должно работать для вас:

public class MyClass
{
public string Item1 { get; set; }
public string Item2 { get; set; }
public string Item3 { get; set; }
public string Long { get; set; }
public string Lat { get; set; }
public override string ToString()
{
var sb = new StringBuilder();
var tempVar =
(AddPropertyData(sb, "{0}", Item1) &&
AddPropertyData(sb, ", item2 {0}", Item2) &&
AddPropertyData(sb, ", item3 {0}", Item3)) &&
AddPropertyData(sb, ", long: {0}, lat: {1}", Long, Lat);

return sb.Length > 0 ? sb.ToString() : Item1;
}

private static bool AddPropertyData(StringBuilder sb, string format, params string[] data)
{
if (data.All(x => !String.IsNullOrWhiteSpace(x)))
{
sb.AppendFormat(format, data);
return true;
}
return false;
}
}

1
ответ дан 8 сентября 2011 в 12:09 Источник Поделиться

Вот еще одна вариация:

public override string ToString() { 
var list = new List<string>();

if (!string.IsNullOrWhiteSpace(Country))
list.Add(string.Format("{0}", Country));

if (!string.IsNullOrWhiteSpace(City))
list.Add(string.Format("city {0}", City));

if (!string.IsNullOrWhiteSpace(Street))
list.Add(string.Format("street {0}", Street));

if (!string.IsNullOrWhiteSpace(Block))
list.Add(string.Format("block {0}", Block));

if (!string.IsNullOrWhiteSpace(Building))
list.Add(string.Format("building {0}", Building));

if (!string.IsNullOrWhiteSpace(Latitude)
&& !string.IsNullOrWhiteSpace(Longitude))
list.Add(string.Format("coordinates {0}:{1}", Latitude, Longitude));

return list.Count > 0 ? String.Join(", ", list.ToArray()) : string.Empty;
}

1
ответ дан 9 сентября 2011 в 03:09 Источник Поделиться

Я хотел сделать что-то вроде этого:

    public override string ToString()
{
string returnValue = string.empty;

if (string.IsNullOrWhiteSpace(Country))
return returnValue; // Note: this is a change from the original code
// That could have returned NULL. But I think the
// intent of the function is to always return some
// form of string.

returnValue = string.Format("{0}", Country);

if (string.IsNullOrWhiteSpace(City))
return returnValue;

returnValue += string.Format(", city {0}", City);

if (string.IsNullOrWhiteSpace(Street))
return returnValue;

returnValue += string.Format(", street {0}", Street);

if (string.IsNullOrWhiteSpace(Block))
return returnValue;

returnValue += string.Format(", block {0}", Block);

if (!string.IsNullOrWhiteSpace(Building))
returnValue += string.Format(", building {0}", Building);

if (!string.IsNullOrWhiteSpace(Latitude) && !string.IsNullOrWhiteSpace(Longitude))
returnValue += string.Format(", coordinates {0}:{1}", Latitude, Longitude);

return returnValue;
}

Если вы хотите слегка сжать его. Хотя я в двух умов погода это стоит или нет:

public class Pair
{
public Pair(string v, string f) { this.Value =v; this.Format = f;}
public string Value { get; private set; }
public string Format { get; private set; }
};

public override string ToString()
{
string returnValue = string.empty;

string[] address = {new Pair(Country, "{0}"),
new Pair(City, ", city {0}"),
new Pair(Street, ", street {0}"),
new Pair(Block, ", block {0}")
};

foreach(Pair loop in address)
{
if (string.IsNullOrWhiteSpace(loop.Value))
return returnValue;

returnValue += string.Format(loop.Format, loop.Value);
}

if (!string.IsNullOrWhiteSpace(Building))
returnValue += string.Format(", building {0}", Building);

if (!string.IsNullOrWhiteSpace(Latitude) && !string.IsNullOrWhiteSpace(Longitude))
returnValue += string.Format(", coordinates {0}:{1}", Latitude, Longitude);

return returnValue;
}

0
ответ дан 8 сентября 2011 в 03:09 Источник Поделиться