2017-09-15 73 views
-1

同样有什么办法来翻译下面的查询获取所有重复开始出现连续

select word 
from string1 
where Left(word, 1) in (
    select Left(word, 1) as firstInitial 
    from string1 
    group by Left(word , 1) 
    having count(*) > 1 
) 

到LINQ,所以当你在运行“虽然金正日一直踢我吃了我的唐恩都乐以极大的趣味“它产生类似于

(miss,Match,Match,Match,miss,miss,miss,Match,Match,miss,Match,Match) 

回答

1

以下解决方案显示了一种可能的方法。要使用此功能,请务必将MoreLINQ NuGet package添加到您的项目中。

using System; 
using System.Linq; 
using MoreLinq; 

namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var input = "While Kim kept kicking I ate my Dunkin donut with great gusto"; 

      var value = input.Split(' '); 

      var lagged = value.Lag(1, (current, previous) => new { current = current?.ToLowerInvariant(), previous = previous?.ToLowerInvariant() }); 
      var leaded = value.Lead(1, (current, next) => new { next = next?.ToLowerInvariant() }); 

      var results = lagged.Zip(leaded, (x, y) => x.current?.FirstOrDefault() == x.previous?.FirstOrDefault() || 
                 x.current?.FirstOrDefault() == y.next?.FirstOrDefault()); 

      Console.WriteLine(string.Join(",", results)); 
      Console.ReadLine(); 
     } 
    } 
} 

基本上代码拆分串分成多个字,然后着眼于每个单词(current)和之前(previous)字和之后(next)它。然后它比较current的第一个字母与previousnext的第一个字母。

如果你想返回1/0而不是true/false然后改变只是这行代码:

var results = lagged.Zip(leaded, (x, y) => (x.current?.FirstOrDefault() == x.previous?.FirstOrDefault() || 
              x.current?.FirstOrDefault() == y.next?.FirstOrDefault()) ? 1 : 0); 
+1

非常感谢你,mjwills。 – user8595118

1

对于这个问题的解决不会像几行简单的,但我可以尝试:

首先,最简单的但不是那么优雅for循环方法:

var words = string1.Split(' ').ToList(); 
string[] results = new string[words.Count]; //edited: can use .Count instead of .Count() 
for (int i = 0; i < words.Count; i++) 
{ 
    if (i == words.Count - 1) 
     results[i] = char.ToLower(words[i - 1][0]) == char.ToLower(words[i][0]) ? "Match" : "miss"; 
    else if (i == 0) 
     results[i] = char.ToLower(words[i + 1][0]) == char.ToLower(words[i][0]) ? "Match" : "miss"; 
    else 
    { 
     bool leftMatch = char.ToLower(words[i - 1][0]) == char.ToLower(words[i][0]); 
     bool rightMatch = char.ToLower(words[i + 1][0]) == char.ToLower(words[i][0]); 
     results[i] = (leftMatch || rightMatch) ? "Match" : "miss"; 
    } 
} 

这样做是通过每个元素,如果左边或右边的单词有相同的首字符,它是一个“匹配”,否则它是“小姐”。对于第一个和最后一个字,它只是需要检查一个邻居,而不是2

使用LINQ的Enumerable.Range Method (Int32, Int32),还有?: Operator,这可以简化为几行:

var words = string1.Split(' ').ToList(); 
var results = Enumerable.Range(0, words.Count).Select(i => i == words.Count - 1 ? 
     char.ToLower(words[i - 1][0]) == char.ToLower(words[i][0]) ? "Match" : "miss" : 
     i == 0 ? 
     char.ToLower(words[i + 1][0]) == char.ToLower(words[i][0]) ? "Match" : "miss" : 
     (char.ToLower(words[i - 1][0]) == char.ToLower(words[i][0]) || char.ToLower(words[i + 1][0]) == char.ToLower(words[i][0])) ? "Match" : "miss").ToList(); 

ToList()在最后是可选的,如果你愿意,你可以转换ToArray()

+0

两者都给我一个错误:Cs0121 c#调用之间的模糊以下方法或属性和 问题是你做一个整数除法(结果也在一个int)和一个int可以隐式转换为双精度和十进制。因此,你需要确保表达结果在其中之一;双倍可能是你想要的。 – user8595118

+0

谢谢你,Keyur PATEL。好的解决方案。我从你那里学到很多,伙计们。伟大的网站! – user8595118