C# 按公共前缀排列的字符串块列表

C# 按公共前缀排列的字符串块列表,c#,.net,linq,C#,.net,Linq,我有一个函数,可以提取最后一个整词上舍入的字符串的最长公共前缀。例如,如果我有以下列表: BRIGGS & STRATTON 290400 BRIGGS & STRATTON 290700 BRIGGS & STRATTON 294400 BRIGGS & STRATTON 294700 我调用longestprifix(数组)它将返回百力通 我试图将字符串列表分块到子列表中,按非空公共前缀分组,但我的想法无法奏效 编辑: 示例列表的生成方式是,对于两个

我有一个函数,可以提取最后一个整词上舍入的字符串的最长公共前缀。例如,如果我有以下列表:

BRIGGS & STRATTON 290400 
BRIGGS & STRATTON 290700 
BRIGGS & STRATTON 294400 
BRIGGS & STRATTON 294700 
我调用
longestprifix(数组)它将返回
百力通

我试图将字符串列表分块到子列表中,按非空公共前缀分组,但我的想法无法奏效

编辑:

示例列表的生成方式是,对于两个连续的元素,my函数要么返回空字符串,要么返回非空字符串:

ALLIS-CHALMERS 816 
ALLIS-CHALMERS 818 
ALLIS-CHALMERS 917 AND 919 
ARIENS GT-17 
ARIENS GT-18 AND GT-19 
BOLENS 1600 
BOLENS 1700 
BOLENS 1900 HT-18 
BOLENS HT-20 AND HT-23 
BOLENS QT-16 
BRIGGS & STRATTON 290400 
BRIGGS & STRATTON 290700 

对于集合中的每个非空子集,
longestPrefix(array)
返回的值可能不同。此外,每个字符串可能属于多个“组”,这取决于组中还有哪些其他项目:例如,如果原始列表包含一些
BRIGGS&SON
项目,则
BRIGGS&STRATTON
项目也可以与
BRIGGS&
项目分组

如果将需求重新定义为按最长公共前缀分组,则可以计算成对公共前缀,获得最长前缀,然后按其分组,如下所示:

void AddLongest(IDictionary<string,string> dict, string s, string p) {
    string current;
    if (!dict.TryGetValue(s, out current) || p.Length > current.Length) {
        dict[s] = p;
    }
}

var longestPrefix = new Dictionary<string,string>();
for (int i = 0 ; i != myStrings.Length ; i++) {
    for (int j = i+1 ; j != myStrings.Length ; j++) {
        var common = FindLongestPrefix(new[] {myStrings[i], myStrings[j]});
        AddLongest(longestPrefix, myStrings[i], common);
        AddLongest(longestPrefix, myStrings[j], common);
    }
}
// Now you can use LINQ to group by the longest common prefix:
var groups = myStrings.GroupBy(s => longestPrefix[s]);
void AddLongest(IDictionary dict、字符串s、字符串p){
串电流;
如果(!dict.TryGetValue(s,输出电流)| | p.Length>current.Length){
dict[s]=p;
}
}
var longestPrefix=新字典();
for(int i=0;i!=myStrings.Length;i++){
for(int j=i+1;j!=myStrings.Length;j++){
var common=FindLongestPrefix(新[]{myStrings[i],myStrings[j]});
AddLongest(最长前缀,myStrings[i],common);
AddLongest(最长前缀,myStrings[j],common);
}
}
//现在,您可以使用LINQ按最长的公共前缀进行分组:
var groups=myStrings.GroupBy(s=>longestPrefix[s]);

否;它将返回
BRIGGS&STRATTON 29
@Slaks它是“最后一个单词的四舍五入”,因此它将返回BRIGGS&STRATTON。@cardell0,我正在尝试使用GroupBy linq功能进行体操,但我不确定如何正确操作。首先,感谢您的回答。当我试图运行你的代码时,我得到“给定的键在字典中不存在。”关于
GroupBy()
method的异常?另外,现在我更改了longestPrefix方法以返回数组中最长的前缀。@Burgos我想我知道那里出了什么问题-我试图修复它,看看更新后的答案。这行代码不编译
var common=longestprifix(new[]{myStrings[i],myStrings[j]})它应该做什么?@shekky这是OP的
最长前缀(数组)
方法。我不小心给我的字典起了同样的名字。