Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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,这是我的剧本 List<String> list = new List<String>(); list.Add("E9215001"); list.Add("E9215045"); list.Add("E1115001"); list.Add("E1115022"); list.Add("E1115003"); list.Add("E2115041"); list.Add("E2115042"); list.Add("E4115021"); list.Add("E5115

这是我的剧本

List<String> list = new List<String>();
list.Add("E9215001");
list.Add("E9215045");
list.Add("E1115001");
list.Add("E1115022");
list.Add("E1115003");
list.Add("E2115041");
list.Add("E2115042");
list.Add("E4115021");
list.Add("E5115062");

然而,我怀疑这是你想要的

var result = list.Select(s => s.Substring(0, 6))
                 .Distinct();

它是否需要内联查询语法?如果是,那么:

var result =
    from item in list
    select item.Substring(0,6);
或有明确要求:

var result =
    (
        from item in list
        select item.Substring(0,6);
    )
    .Distinct();

我不确定确定确定匹配的标准是什么,所以我写了这篇文章——它完全是新颖的,99.9999%的确定性表明它实际上不是你想要的

本质上,外部选择获取确定长度的所有子字符串

第一个内部选择确定列表中至少一个其他字符串中该字符串的最大长度

跟随第一个“内部选择”的“分组”将自己分组找到的长度

然后将该分组转换为长度与找到该分组的次数相对应的字典

然后,我们按照长度递增的频率值对这组分组进行排序

接下来,我们将实际长度——最不频繁出现的长度——从Key开始,并将其吐回到Substring的第二个参数中,因此我们将子字符串从0取到该长度。当然,我们现在回到了外部选择,所以我们实际上得到了值万岁

现在,我们从结果中得到一组不同的值,瞧

list.Select(
    item => item.Substring(0, 
        list.Select(
            innerItem => Enumerable.Range(1, innerItem.Length)
                           .Reverse()
                           .First(proposedlength => list.Count(innerInnerItem => innerInnerItem.StartsWith(innerItem.Substring(0, proposedlength))) > 1)
                   )
            .GroupBy(length => length)
            .ToDictionary(grouping => grouping.Key, grouping => grouping.Count())
            .OrderBy(pair => pair.Value)
            .Select(pair => pair.Key)
            .First())
        ).Distinct()
在阅读了上面的评论之后,我发现在每个术语的任何其他子串中都有一个明显的最长子串。以下是更新颖的代码:

list.Select((item, index) => new {
    Index=index, 
    Length=Enumerable.Range(1, item.Length)
                     .Reverse()
                     .First(proposedLength => list.Count(innerItem => innerItem.StartsWith(item.Substring(0, proposedLength))) > 1)
}).Select(n => list[n.Index].Substring(0, n.Length))
  .Distinct()
简言之,遍历列表中的每个项,并收集该项的索引和该元素开头最长的子字符串,这些子字符串可能在列表中的至少一个其他项中找到。然后从每个索引/长度对中收集所有子字符串,只取不同的字符串集。

解决了!感谢@mlorbetske和@shelleybutterfly


与我的答案相同。。丢弃的!另外,对于长度超过6的字符串s,s.Remove6相当于s.Substring0,6。谢谢!但前6个字符并不总是恒定的!,它们也可能有所不同。。我已经编辑了我的问题。现在检查!提前谢谢!字符串是否总是相同的长度?E1115001和E1115003是否与E111500等相同,或者仅当所有元素都以公共值开头时才视为相同?否,它们并不总是相同的。前6个字符并不总是恒定的!,它们也可能有所不同。。我已经编辑了我的问题。现在检查!提前谢谢!好的,那么这是否意味着你需要提取一些不同的东西,关于上面sa_ddam213的问题;e、 g.根据上面的材料列表,您是否需要提取E11150和E111500,因为这两个都是重复的?[oops E11150在我看来并没有重复]好的;另一种我认为可能有效的方法是提取最长的常见字符串更难的问题,这给了我列表:E92150、E111500、E211504和E。如果这是您需要的,我会看一看。谢谢!但前6个字符也不是常数!,它们也可能有所不同。。我已经编辑了我的问题。现在检查!提前谢谢!第二个解决方案非常好!!!!非常感谢。非常感谢。我刚刚通过修改Length=Enumerable.Range1,item.Length-2实现了这一目标。我还感谢@shelleybutterfly的努力。我同意genius部分的观点:嘿@mlorbetske;我试着生成一些随机的数字串来测试我的解决方案与你的解决方案,但似乎有点窒息;这是否假设所有字符串都是相同的长度?嗯,我将所有字符串设置为相同的长度,但仍然失败,是否假设至少会有一些匹配,也许?@shelleybutterfly我使用dis 2 easeup考勤过程4 d功能。在课堂上表现得很好!罗尔诺的长度相同。最后两位数字中的每一个螺柱。如果在键入Rollno后逗号是prssd,我会自动加载d最常用的部分。所以工作人员可以用两位数的数字来输入d,而不是输入d!然而,在某些情况下,一个类别可能包含r转移至其他类别的螺柱。在这种情况下,我需要找到2个d多个组件。现在两个u型坦克的家伙,我能在逗号按下后加载d第一个最常见的部分,如果ALT+Comma为prssd,则我加载下一个最常见的部分并循环它。@shelleybutterfly有3个假设1-所有字符串均为空2-所有字符串至少有一个公共字母3-取决于您使用的是哪一个-所有字符串的长度至少为公共子字符串的长度
list.Select((item, index) => new {
    Index=index, 
    Length=Enumerable.Range(1, item.Length)
                     .Reverse()
                     .First(proposedLength => list.Count(innerItem => innerItem.StartsWith(item.Substring(0, proposedLength))) > 1)
}).Select(n => list[n.Index].Substring(0, n.Length))
  .Distinct()
list.Select((item, index) => new { Index=index, 
            Length=Enumerable.Range(1, (item.Length-2)) //I don't need the last 2 Char so I'm ignoring it
            .Reverse()
            .First(proposedLength => list.Count(innerItem =>  
             innerItem.StartsWith(item.Substring(0, proposedLength))) > 
             1)}).Select(n => list[n.Index].Substring(0, n.Length)).Distinct()