C# 从c语言中的一组重复单词列表中形成一个不同的单词列表
我有一个模型:C# 从c语言中的一组重复单词列表中形成一个不同的单词列表,c#,linq,C#,Linq,我有一个模型: public class CompanyModel1 { public string compnName1 { get; set; } public string compnKeyProcesses1 { get; set; } } 然后我形成一个列表: List<CompanyModel1> companies1 = new List<CompanyModel1>(); 我将获得如下价值: CName
public class CompanyModel1
{
public string compnName1 { get; set; }
public string compnKeyProcesses1 { get; set; }
}
然后我形成一个列表:
List<CompanyModel1> companies1 = new List<CompanyModel1>();
我将获得如下价值:
CName = "name1"
Process = "Casting, Casting, Casting, Welding, brazing & soldering"
及
现在,我想形成一个不同进程的列表,并计算它们的数量,以及每个进程使用不同名称的次数
例如,对于上面这两个,我必须形成如下列表:
"Casting, Welding, brazing & soldering, Forming & Forging, Moulding"
如果我计算的话,将会有:5个不同的过程;按每个名称列出的频率:
"Casting" appears in 2 names
"Welding" appears in 2 names
"brazing & soldering" appears in 1 names
"Forming & Forging" appears in 1 names
"Moulding" appears in 1 names
我认为Linq可以帮助解决这个问题,可能是这样的:
var list= Process
.SelectMany(u => u.Split(new string[] { ", " }, StringSplitOptions.None))
.GroupBy(s => s)
.ToDictionary(g => g.Key, g => g.Count());
var numberOfProcess = list.Count;
var numberOfNameWithProcessOne = frequency["Process1"];
但是,我怎样才能将其放入foreach循环中,并应用我拥有的所有名称和进程,从而得到我想要的结果呢
var processes = companies1.SelectMany(
c => c.compnKeyProcesses1.Split(new char[] { ',' }).Select(s => s.Trim()).Distinct())
.GroupBy(s => s).ToDictionary(g => g.Key, g => g.Count());
foreach(var process in processes)
{
Console.WriteLine("\"{0}\" appears in {1} names", process.Key, process.Value);
}
这将仅从每个公司选择不同的流程,然后使用SelectMany创建所有主列表,以存储每个流程的正确唯一出现次数。然后,我们只需计算最终列表中每个进程的出现次数,并将它们放入process=>count的字典中
编辑:
下面是另一个解决方案,它将数据分组到字典中,以便显示每个流程的关联公司。字典来自流程名称->公司名称列表
Func<string, IEnumerable<string>> stringToListConverter = s => s.Split(new char[] { ',' }).Select(ss => ss.Trim());
var companiesDict = companies1.ToDictionary(c => c.compnName1, c => stringToListConverter(c.compnKeyProcesses1).Distinct());
var processesAll = companies1.SelectMany(c => stringToListConverter(c.compnKeyProcesses1)).Distinct();
var processesToNames = processesAll.ToDictionary(s => s, s => companiesDict.Where(d => d.Value.Contains(s)).Select(d => d.Key).ToList());
foreach(var processToName in processesToNames)
{
List<string> companyNames = processToName.Value;
Console.WriteLine("\"{0}\" appears in {1} names : {2}", processToName.Key, companyNames.Count, String.Join(", ", companyNames));
}
我保存了stringToListConverter Func委托,以将流程字符串转换为列表,并在两个查询中使用了该委托
如果CompanyModel1类将compnkeyProcess1字段存储为列表而不是一个大字符串,则此查询的可读性会更高。这样,您可以立即查询列表,而不是每次都进行拆分、选择和修剪。我认为这是另一个完美的答案!只是想知道,是否也可以打印出它出现的名称?铸造出现在11个名字是:名字1,名字2,…,从这我可以很容易地检查结果…实际上,这更有意义。我将更新我的答案,以包含另一个解决方案,该解决方案通过不同的数据结构来处理这两种情况。非常乐意提供帮助,有趣的问题:
var processes = companies1.SelectMany(
c => c.compnKeyProcesses1.Split(new char[] { ',' }).Select(s => s.Trim()).Distinct())
.GroupBy(s => s).ToDictionary(g => g.Key, g => g.Count());
foreach(var process in processes)
{
Console.WriteLine("\"{0}\" appears in {1} names", process.Key, process.Value);
}
Func<string, IEnumerable<string>> stringToListConverter = s => s.Split(new char[] { ',' }).Select(ss => ss.Trim());
var companiesDict = companies1.ToDictionary(c => c.compnName1, c => stringToListConverter(c.compnKeyProcesses1).Distinct());
var processesAll = companies1.SelectMany(c => stringToListConverter(c.compnKeyProcesses1)).Distinct();
var processesToNames = processesAll.ToDictionary(s => s, s => companiesDict.Where(d => d.Value.Contains(s)).Select(d => d.Key).ToList());
foreach(var processToName in processesToNames)
{
List<string> companyNames = processToName.Value;
Console.WriteLine("\"{0}\" appears in {1} names : {2}", processToName.Key, companyNames.Count, String.Join(", ", companyNames));
}