LINQ:选择字符串中任何单词以某个字符开头的行
我希望从表中提取列(字符串)中至少有一个以指定字符开头的单词的所有行。 例如: 如果指定的字符是T->I,我将提取所有3行 如果指定的字符是S->I,则只提取第二列 请帮助我假设您的意思是“以空格分隔的字符序列,或从空格开始或从空格到结尾”是“word”,那么您可以在分隔符上拆分并测试它们是否匹配:LINQ:选择字符串中任何单词以某个字符开头的行,linq,Linq,我希望从表中提取列(字符串)中至少有一个以指定字符开头的单词的所有行。 例如: 如果指定的字符是T->I,我将提取所有3行 如果指定的字符是S->I,则只提取第二列 请帮助我假设您的意思是“以空格分隔的字符序列,或从空格开始或从空格到结尾”是“word”,那么您可以在分隔符上拆分并测试它们是否匹配: var src = new[] { "this is the first row", "this is th second row", "this is the third
var src = new[] {
"this is the first row",
"this is th second row",
"this is the third row"
};
var findChar = 'S';
var lowerFindChar = findChar.ToLower();
var matches = src.Where(s => s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Any(w => w.ToLower()[0] == lowerFindChar));
LINQ可枚举。任何
方法,因此您可以将每个字符串拆分为一个单词序列,并查看是否有任何单词以所需字母开头,以补偿大小写。假设您指的是“以空格分隔的字符序列,或以空格开头或空格结尾”的“单词”,然后,您可以拆分分隔符并测试它们是否匹配:
var src = new[] {
"this is the first row",
"this is th second row",
"this is the third row"
};
var findChar = 'S';
var lowerFindChar = findChar.ToLower();
var matches = src.Where(s => s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Any(w => w.ToLower()[0] == lowerFindChar));
LINQ可枚举。任何
方法,因此您可以将每个字符串拆分为一个单词序列,并查看是否有任何单词以所需字母开头,以补偿大小写。尝试以下操作:
rows.Where(r => Regex.IsMatch(r, " [Tt]"))
您可以将Tt
替换为Ss
(假设您想要大写或小写)。尝试以下方法:
rows.Where(r => Regex.IsMatch(r, " [Tt]"))
您可以将
Tt
替换为Ss
(假设您想要大写或小写)。问题当然是,“单词”是什么
根据您的定义,上面句子中的字符序列“单词”是否为单词?它不是以空格开始的,甚至不是空白
一个词的定义可以是:
定义wordCharacter:类似于A-Z,A-Z的东西。定义单词: -字符串开头的单词字符的非空序列,后跟非单词字符 -或字符串末尾的非空字字符序列,前面有一个非字字符 -字符串中后跟非单词字符的任何非空单词字符序列 定义单词的开头:单词的第一个字符 字符串:“一些奇怪的字符:'A',9,ll,B9 C$X? -单词:一些,奇怪的字符,一个 -不是文字:9,ll,B9,C$X 因此,首先必须精确地指定单词的含义,然后才能定义函数 我将把它作为
IEnumerable
的扩展方法编写。用法将类似于LINQ。请参阅
bool-IsWordCharacter(charc){…TODO:实现您对单词字符的定义}
静态IEnumerable拆分为文字(此字符串文本)
{
//TODO:文本为空时异常
如果(text.Length==0)返回
int startIndex=0;
while(startIndex!=text.Length)
{//不在字符串末尾。查找下一个单词的开头:
while(startIndex
现在,您已经有了将任何字符串拆分为单词定义的过程,您的查询将变得简单:
IEnumerabl<string> texts = ...
char specifiedChar = 'T';
// keep only those texts that have at least one word that starts with specifiedChar:
var textsWithWordThatStartsWithSpecifiedChar = texts
// split the text into words
// keep only the words that start with specifiedChar
// if there is such a word: keep the text
.Where(text => text.SplitIntoWords()
.Where(word => word.Length > 0 && word[0] == specifiedChar)
.Any());
IEnumerabl text=。。。
char specifiedChar='T';
//仅保留至少有一个以specifiedChar开头的单词的文本:
var textswithwordthattstartswithspecifiedchar=文本
//把课文分成几个字
//只保留以specifiedChar开头的单词
//如果有这样一个词:保留文本
.Where(text=>text.SplitIntoWords()
.Where(word=>word.Length>0&&word[0]==specifiedChar)
.Any());
问题当然是,“单词”是什么
根据您的定义,上面句子中的字符序列“word”是一个单词吗?它不是以空格开头的,甚至不是空格
一个词的定义可以是:
定义wordCharacter:类似于A-Z,A-Z的东西。
定义单词:
-字符串开头的单词字符的非空序列,后跟非单词字符
-或字符串末尾的非空字字符序列,前面有一个非字字符
-字符串中后跟非单词字符的任何非空单词字符序列
定义单词的开头:单词的第一个字符
字符串:“一些奇怪的字符:'A',9,ll,B9 C$X?
-单词:一些,奇怪的字符,一个
-不是文字:9,ll,B9,C$X
因此,首先必须精确地指定单词的含义,然后才能定义函数
我将把它写成IEnumerable
的扩展方法。用法将类似于LINQ。看
bool-IsWordCharacter(charc){…TODO:实现您对单词字符的定义}
静态IEnumerable拆分为文字(此字符串文本)
{
//TODO:文本为空时异常
如果(text.Length==0)返回
int startIndex=0;
while(startIndex!=text.Length)
{//不在字符串末尾。查找下一个单词的开头:
while(startIndexvar yourChar = "s";
var texts = new List<string> {
"this is the first row",
"this is th second row",
"this is the third row"
};
var result = texts.Where(p => p.StartsWith(yourChar) || p.Contains(" " + yourChar));
var result = texts.Where(p => (" " + p).Contains(" " + yourChar));