Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从c语言中的一组重复单词列表中形成一个不同的单词列表_C#_Linq - Fatal编程技术网

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));
}