C#LINQ将合并两家分拆公司

C#LINQ将合并两家分拆公司,c#,arrays,string,linq,C#,Arrays,String,Linq,我正在寻找简单的LINQ来解决这个问题: string[] breakups = new[] { "YQ:50/BF:50/YR:50", "YQ:50/SR:50", "YQ:50/BF:50/YR:50", "XX:00 .... and so on" }; // LINQ expression string expectedResult = "YQ:150/BF:100/YR:100/SR:50"; 我的替代解决方案如下 public static s

我正在寻找简单的LINQ来解决这个问题:

string[] breakups = new[]
{
    "YQ:50/BF:50/YR:50",
    "YQ:50/SR:50",
    "YQ:50/BF:50/YR:50",
    "XX:00 .... and so on"
};

// LINQ expression

string expectedResult = "YQ:150/BF:100/YR:100/SR:50";
我的替代解决方案如下

public static string CalcRTBreakup(string pstrBreakup)
{
  string lstrBreakup = pstrBreakup;
    try
    {
        string[] lstrArrRB = lstrBreakup.Split('@');
        string[] lstrArrBreakupSplit = new string[lstrBreakup.Split('@')[0].Split('|').Length];
        for (int count = 0; count < lstrArrRB.Length; count++)
        {
            string[] lstrArrtemp = lstrArrRB[count].Split('|');
            for (int countinner = 0; countinner < lstrArrtemp.Length; countinner++)
            {
                if (string.IsNullOrEmpty(lstrArrBreakupSplit[countinner]))
                    {
                        if (string.IsNullOrEmpty(lstrArrtemp[countinner]))
                            continue;
                        lstrArrBreakupSplit[countinner] = lstrArrtemp[countinner];
                    }
                    else
                    {
                        if (string.IsNullOrEmpty(lstrArrtemp[countinner]))
                            continue;
                        lstrArrBreakupSplit[countinner] += "/" + lstrArrtemp[countinner];
                    }
                }
            }
            for (int count = 0; count < lstrArrBreakupSplit.Length; count++)
            {
                if (string.IsNullOrEmpty(lstrArrBreakupSplit[count]))
                    continue;
                lstrArrBreakupSplit[count] = CalcRTBreakupDict(lstrArrBreakupSplit[count].TrimEnd('/')).TrimEnd('/');
            }
            lstrBreakup = string.Empty;
            foreach (string strtemp in lstrArrBreakupSplit)
            {
                lstrBreakup += strtemp + '|';
        }
        return lstrBreakup;
    }
    catch (Exception)
    {
        return "";
    }
}
public static string CalcRTBreakupDict(string pstrBreakup)
{
    string lstrBreakup = pstrBreakup;
    Dictionary<string, double> ldictDreakup = new Dictionary<string, double>();
    try
    {
        lstrBreakup = lstrBreakup.TrimEnd('/').Trim();
        string[] lstrArrBreakup = lstrBreakup.Split('/');
        foreach (string strBr in lstrArrBreakup)
        {
            string[] lstrBreakupCode = strBr.Split(':');
            if (!ldictDreakup.Keys.Contains(lstrBreakupCode[0]))
            {
                double lintTemp = 0; double.TryParse(lstrBreakupCode[1], out lintTemp);
                ldictDreakup.Add(lstrBreakupCode[0], lintTemp);
            }
            else
            {
                double lintTemp = 0; double.TryParse(lstrBreakupCode[1], out lintTemp);
                lintTemp = lintTemp + ldictDreakup[lstrBreakupCode[0]];
                ldictDreakup.Remove(lstrBreakupCode[0]);
                ldictDreakup.Add(lstrBreakupCode[0], lintTemp);
            }
        }
        lstrBreakup = string.Empty;
        foreach (string dictKey in ldictDreakup.Keys)
        {
            lstrBreakup += dictKey + ":" + ldictDreakup[dictKey] + "/";
        }
        return lstrBreakup;
    }
    catch (Exception)
    {
        return pstrBreakup;
    }
}
公共静态字符串CalcRTBreakup(字符串pstrBreakup)
{
字符串lstrBreakup=pstrBreakup;
尝试
{
字符串[]lstrarrb=lstrBreakup.Split('@');
string[]lstrarrbreakupplit=新字符串[lstrBreakup.Split('@')[0].Split('|').Length];
for(int count=0;count
查看结果,我假设您在分号后添加值,分号前的标签与之匹配

它可以被视为一个有趣的小测验,也许更适合另一个stackexchange站点,但无论如何

这可以通过一个简单(但不是很短)的linq表达式实现:

breakups
    .Select(c => c.Split('/'))
    .SelectMany(c => c)
    .Select(c => new
            {
                Label = c.Split(':')[0],
                Value = Convert.ToInt32(c.Split(':')[1])
            })
    .GroupBy(c => c.Label)
    .Select(c => new
            {
                Label = c.Key,
                Value = c.Sum(x => x.Value)
            })
    .OrderByDescending(c => c.Value)
    .Select(c => c.Label + ":" + c.Value)
    .Aggregate((s1,s2) => s1 + "/" + s2)

查看结果,我假设您在分号之后添加值,分号之前的标签与之匹配

它可以被视为一个有趣的小测验,也许更适合另一个stackexchange站点,但无论如何

这可以通过一个简单(但不是很短)的linq表达式实现:

breakups
    .Select(c => c.Split('/'))
    .SelectMany(c => c)
    .Select(c => new
            {
                Label = c.Split(':')[0],
                Value = Convert.ToInt32(c.Split(':')[1])
            })
    .GroupBy(c => c.Label)
    .Select(c => new
            {
                Label = c.Key,
                Value = c.Sum(x => x.Value)
            })
    .OrderByDescending(c => c.Value)
    .Select(c => c.Label + ":" + c.Value)
    .Aggregate((s1,s2) => s1 + "/" + s2)
string[]分手=
{
“YQ:50/BF:50/YR:50”,
“YQ:50/SR:50”,
“YQ:50/BF:50/YR:50”,
“XX:00”
};
var groups=来自分解中的行//这些是数组中的项目
从第行中的项拆分(“/”)//每个项将在“/”处拆分
让pair=item.Split(“:”)//每对在“:”处拆分
让key=pair[0]//我们的密钥是第一项。。。
让value=int.Parse(对[1])//该值是第二个
按键分组值//让我们按键分组
分组
设sum=singleGroup.sum()//并构建每个组的sum
其中sum>0//过滤掉所有内容
string[]分解=
{
“YQ:50/BF:50/YR:50”,
“YQ:50/SR:50”,
“YQ:50/BF:50/YR:50”,
“XX:00”
};
var groups=来自分解中的行//这些是数组中的项目
从第行中的项拆分(“/”)//每个项将在“/”处拆分
让pair=item.Split(“:”)//每对在“:”处拆分
让key=pair[0]//我们的密钥是第一项。。。
让value=int.Parse(对[1])//该值是第二个
按键分组值//让我们按键分组
分组
设sum=singleGroup.sum()//并构建每个组的sum
其中sum>0//过滤掉所有内容
代码可能包含语法错误,因为我没有测试它


代码可能包含语法错误,因为我没有测试过它。

如果不需要按值排序,只需执行以下操作即可

var res = string.Join("/", breakups
                              .SelectMany(m => m.Split('/'))
                              .Select(x => x.Split(':'))
                              .GroupBy(m => m[0])
                              .Select(m => string.Format("{0}:{1}", m.Key, m.Sum(g => Int32.Parse(g[1])))));
如果您需要订购

var res = string.Join("/", breakups
                              .SelectMany(m => m.Split('/'))
                              .Select(x => x.Split(':'))
                              .GroupBy(m => m[0])
                              .Select(m => new
                              {
                                  key = m.Key,
                                  val = m.Sum(g => Int32.Parse(g[1]))
                              })
                              .OrderByDescending(m => m.val)
                              .Select(m => string.Format("{0}:{1}", m.key, m.val)));

如果您不需要按值排序,您只需这样做即可

var res = string.Join("/", breakups
                              .SelectMany(m => m.Split('/'))
                              .Select(x => x.Split(':'))
                              .GroupBy(m => m[0])
                              .Select(m => string.Format("{0}:{1}", m.Key, m.Sum(g => Int32.Parse(g[1])))));
如果您需要订购

var res = string.Join("/", breakups
                              .SelectMany(m => m.Split('/'))
                              .Select(x => x.Split(':'))
                              .GroupBy(m => m[0])
                              .Select(m => new
                              {
                                  key = m.Key,
                                  val = m.Sum(g => Int32.Parse(g[1]))
                              })
                              .OrderByDescending(m => m.val)
                              .Select(m => string.Format("{0}:{1}", m.key, m.val)));

我通过那个代码获得了我的结果。但我想简化一下。链接codereview更有用。我通过该代码获得了我的结果。但我想简化一下。链接codereview更有用。这是唯一一个对每行都有解释的链接;-)每行只有一个解释;-)