C#LINQ将合并两家分拆公司
我正在寻找简单的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
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更有用。这是唯一一个对每行都有解释的链接;-)每行只有一个解释;-)