如果我有以下邮政地址:
地址1:NULL
地址2:36
地址3:月出车道
地址4:NULL
地址5:伦敦
我想重新格式化地址,以便最终得到:
地址1:36
地址2:月出车道
地址3:伦敦
地址4:NULL
地址5:NULL
我开始搞乱SortedList,但我不太清楚如何继续。
SortedList<int, string> AddressParts = new SortedList<int, string>();
AddressParts.Add(1, IncomingAddress1);
AddressParts.Add(2, IncomingAddress2);
AddressParts.Add(3, IncomingAddress3);
AddressParts.Add(4, IncomingAddress4);
AddressParts.Add(5, IncomingAddress5);
SortedList<int, string> SortedAddressParts = new SortedList<int, string>();
foreach (KeyValuePair<int, string> pair in AddressParts)
{
if (pair.Key == 1 &&!string.IsNullOrEmpty(pair.Value))
{
SortedAddressParts.Add(1, pair.Value);
}
}
非常感谢任何帮助!
答案 0 :(得分:3)
假设你想要的是在最后放置空行并保持文本条目的顺序 考虑这样做:
public IList<string> FormatAddress(IList<string> addressParts)
{
var result = addressParts.Where(a => !string.IsNullOrEmpty(a)).ToList();
result = result.Concat(Enumerable.Repeat((string)null, addressParts.Count - result.Count)).ToList();
return result;
}
它可以使用任意数量的地址行,你只需要将它们包装在任何类型的列表中。
答案 1 :(得分:1)
如果您可以将地址变量表示为数组,那么以下算法将实现您想要的结果:
String[] address = {
null,
"36",
"Moonrise Drive",
null,
"London"
};
List<String> address_new = new List<String>();
foreach (String s in address)
{
if (!String.IsNullOrEmpty(s))
address_new.Add(s);
}
for (int i = address_new.Count(); i < address.Length; i++)
{
address_new.Add(String.Empty);
}
address = address_new.ToArray();
答案 2 :(得分:0)
我认为您希望保留int key
以及更改Values
的顺序。你可以这样做:
var sorted = AddressParts.Where(x => x.Value != null) //or IsNullOrEmpty
.Concat(AddressParts.Where(x => x.Value == null))
.Select((x, i) => new { Key = i + 1, x.Value })
.ToDictionary(x => x.Key, x => x.Value);
要在SortedList<,>
中获取它,只需将字典传递给它的构造函数即可。
SortedAddressParts = new SortedList<int, string>(sorted);
答案 3 :(得分:-1)
如果您希望地址也排序,您可以使用类似
的内容int i = 1;
List<string> values = AddressParts.Values.OrderByDescending(c => c).ToList<string>();
SortedAddressParts = new SortedList<int, string>(values.ToDictionary(s => i++));
但这也会对地址进行排序。