繁体   English   中英

字符串串联C#与类列表

[英]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)

希望这可以帮助!

使用字典的想法很好。 但是,我将分两个步骤进行操作:

  1. 将数据收集到排序的集合中。
  2. 连接客户和站点。

我将不使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM