我试图得到第一个字符出现在文本中,保持他们原来的顺序。我试着使用LINQ,但我在这方面是很新的,所以有些地方不对劲,而且我的结果很糟糕。
例如,我写了:“语言”,所以结果是l-0,a-1,n-2,g-3,u-4,e-7,s-8 (数字平均发生指数)。但是我的代码给出了: l-0,a-1,n-2,g-3,u-4,e-5,s-6.
所以指数是0,1,2,3,4,5,无论如何。这是我的密码:
char[] result = text.ToLower()
.Where(char.IsLetter)
.GroupBy(x => x)
.Select(g => g.Key).ToArray();
for (int i = 0; i < result.Length; i++)
{
listView1.Items.Add(result[i].ToString());
listView1.Items[i].SubItems.Add(i.ToString());
}发布于 2011-03-15 19:38:50
我会用Regex
using System.Text.RegularExpressions;
var q = from ch in text.Distinct()
select Regex.Match(text, ch.ToString());
foreach (var item in q)
{
Console.WriteLine("{0}-{1}", item.Value, item.Index);
}还有一种非正则的选择:
var q = from ch in text.Distinct()
select new { Value = ch, Index = text.IndexOf(ch) };发布于 2011-03-15 19:40:50
使用LINQ,我相信您正在尝试完成以下工作:
string input = "languages";
var query = input.Select((c, i) => new { Char = c, Index = i })
.Where(o => Char.IsLetter(o.Char))
.GroupBy(o => o.Char)
.Select(g => g.First());
foreach (var item in query)
{
Console.WriteLine("{0}: {1}", item.Char, item.Index);
}可以使用重载的Select方法获取每个字符的索引。捕获原始索引后,您可以进一步操作结果。现在您可以只对字符进行筛选,按字符对它们进行分组,最后从每个组中获取First()项。
发布于 2011-03-15 19:41:49
你想在这里使用LINQ有什么具体原因吗?
您没有保留LINQ查询中第一次出现的位置。你得到的只是一个简单的所有字符的列表。
循环遍历字符串中的字符,并使用Dictionary<char,int>存储第一次出现的位置,就可以完成任务。
public static Dictionary<char, int> FirstOccurence(string str)
{
char[] strArr = str.ToCharArray();
Dictionary<char, int> firstOccur = new Dictionary<char, int>();
for (int i = 0; i < strArr.Length; i++)
{
if (!firstOccur.ContainsKey(strArr[i]))
{
firstOccur[strArr[i]] = i;
}
}
return firstOccur;
}https://stackoverflow.com/questions/5316965
复制相似问题