[英]String concatenation C# with List of Class
这可能是非常基本的C#问题,因为我仅自己学习C#,有些事情我没有逻辑可以开始。
我有一个CustomerSite
类,其string Customer {get;set}
, string Site {get;set;}
我创建一个列表List<CustomerSite> listCustomerSite= new List<CustomerSite>();
假设我有一个包含以下数据的列表
SAMSUNG CHINA
SAMSUNG AMERICA
SAMSUNG AFRICA
LG CHINA
APPLE AMERICA
APPLE CHINA
我想要1个串联的字符串
string Result = "APPLE (AMERICA, CHINA), LG (CHINA), SAMSUNG (AFRICA, AMERICA, CHINA)"
我该怎么办?
我的想法是使用词典保留不同客户的列表,并将站点添加到字符串中,但我仍然不知道如何处理排序(AFRICA --> AMERICA --> CHINA)
Dictionary<string, int> dictCustomer = new Dictionary<string, int>();
foreach (var i in listCustomerSite)
{
if (!dictCustomer.ContainsKey(i.Customer))
{
dictCustomer.Add(i.Customer, 0);
Result = Result + "," + "i.Customer" + "( i.Site) ";
}
else
{
Result.Replace(")", "," + i.Site + ")");
}
}
您可以使用LINQ和String.Join
按客户对集合进行分组,将每个分组转换为带有排序的逗号分隔站点的格式化字符串,然后将它们组合为单个字符串:
var customersWithLocations = listCustomerSite
.GroupBy(cs => cs.Customer)
.Select(g => $"{g.Key} ({String.Join(", ", g.Select(cs => cs.Site).OrderBy(s => s))})")
.ToArray();
string result = String.Join(", ", customersWithLocations);
一行LINQ语句可以完成所有操作:
var list = listCustomerSite
.GroupBy(c => c.Customer)
.Select(g => $"{g.Key} ({string.Join(", ", g.Select(c => c.Site))})")
.ToList();
这将产生所需的输出,并按要求排序:
public class CustomerSite
{
public CustomerSite(string customer, string site)
{
Customer = customer;
Site = site;
}
public string Customer { get; set; }
public string Site { get; set; }
}
class Program
{
static void Main(string[] args)
{
var listCustomerSite = new List<CustomerSite>()
{
new CustomerSite("SAMSUNG", "CHINA"),
new CustomerSite("SAMSUNG", "AMERICA"),
new CustomerSite("SAMSUNG", "AFRICA"),
new CustomerSite("LG", "CHINA"),
new CustomerSite("APPLE", "AMERICA"),
new CustomerSite("APPLE", "CHINA")
};
var list = from cs in listCustomerSite
group cs by cs.Customer into g
orderby g.Key
select $"{g.Key} ({string.Join(", ", g.OrderBy(c => c.Site).Select(c => c.Site))})";
Console.WriteLine(string.Join(", ", list));
Console.ReadKey();
}
}
输出:
APPLE (AMERICA, CHINA), LG (CHINA), SAMSUNG (AFRICA, AMERICA, CHINA)
希望这可以帮助!
使用字典的想法很好。 但是,我将分两个步骤进行操作:
我将不使用LINQ,因为它将更具指导性,并展示了做事的基本方式(因为您正在学习C#)。
我正在使用SortedDictionary<TKey, TValue>
因为它会自动按键(在本例中为客户)对条目进行排序。
var dictCustomer = new SortedDictionary<string, SortedSet<string>>();
想法是使用客户名称作为键,使用一组排序的站点作为值。 SortedSet<T>
不仅使条目保持排序,而且消除了重复项(此处不需要)。
foreach (CustomerSite customerSite in listCustomerSite) {
if (dictCustomer.TryGetValue(customerSite.Customer, out var siteSet)) {
siteSet.Add(customerSite.Site);
} else {
siteSet = new SortedSet<string> { customerSite.Site };
dictCustomer.Add(customerSite.Customer, siteSet);
}
}
现在,让我们构建结果字符串:
var sb = new StringBuilder();
foreach (var keyValuePair in dictCustomer) {
if (sb.Length > 0) {
sb.Append(", ");
}
sb.Append(keyValuePair.Key).Append(" ("); // Appends the customer and " (".
bool nextSite = false;
foreach (string site in keyValuePair.Value) {
if (nextSite) {
sb.Append(", ");
}
sb.Append(site);
nextSite = true;
}
sb.Append(")");
}
string result = sb.ToString();
请注意, StringBuilder
比直接串联字符串更有效,因为StringBuilder
内部使用缓冲区,缓冲区仅根据需要增长,而字符串串联则在每个步骤创建一个新的字符串对象,并涉及一遍又一遍地复制不断增长的字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.