我想通过输入文本文件返回C#中的唯一值计数

时间:2013-03-01 13:34:58

标签: c# regex collections

假设有以下行:

  

英格兰队员:弗林托夫   英格兰队员:弗林托夫   英格兰B队球员:施特劳斯
  英格兰队员:施特劳斯   印度队球员A:Sachin Tendulkar
  印度队球员B:Sachin Tendulkar
  印度队球员A:Javagal Srinath

现在我想要的是搜索和返回唯一值计数,就像我想搜索英格兰球员的唯一计数一样,它应该给我2,如上例所示。

我试过的代码,但是没有用:

string searchKeyword = "England";
string fileName = @"C:\Users\karansha\Desktop\search tab.txt";
string[] textLines = File.ReadAllLines(fileName);
List<string> results = new List<string>();
foreach (string line in textLines)
{
    if (line.Contains(searchKeyword))
    {
        results.Add(line);
    }
}
List<string> users = new List<string>();
Regex regex = new Regex(@"player:\s*(?<playername>.*?)\s+appGUID");
MatchCollection matches = regex.Matches(searchKeyword);
foreach (Match match in matches)
{
    var user = match.Groups["username"].Value;
    if  (!users.Contains(user)) users.Add(user);
}
int numberOfUsers = users.Count;
Console.WriteLine(numberOfUsers);
// keep screen from going away
// when run from VS.NET
Console.ReadLine();

4 个答案:

答案 0 :(得分:1)

更简单的方法是使用LINQ:

string searchKeyword = "England";
string fileName = @"C:\Users\renan.stigliani\Desktop\search tab.txt";
string[] textLines = File.ReadAllLines(fileName);

int numberOfUsers = textLines
                        .Where(x => x.Contains(searchKeyword))
                        .Distinct()
                        .Count();

Console.WriteLine(numberOfUsers);

// keep screen from going away
// when run from VS.NET
Console.ReadLine();

正如@DominicKexel所说,我横扫了foreach

答案 1 :(得分:0)

可能听起来有点简单,但你为什么不从列表中选择不同的? 示例:

string searchKeyword = "England";
string fileName = @"C:\Users\karansha\Desktop\search tab.txt";
string[] textLines = File.ReadAllLines(fileName);
List<string> results = new List<string>();
foreach (string line in textLines)
{
    if (line.Contains(searchKeyword))
    {
        results.Add(line);
    }
}
List<string> users = results.Distinct().toList();

这将为您提供独特的线条,您需要拆分,您可以轻松完成。 你可以知道有多少与计数有关。

答案 2 :(得分:0)

如果您不熟悉正则表达式方法,可以将值(例如“England player:Foo”)添加到Dictionary对象,使值成为键,因此不会添加重复项,然后使用Count方法。另请参阅 ContainsKey 方法。

http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

答案 3 :(得分:0)

  1. 您需要检查您的列表是否已包含关键字
  2. 使用字典集合。
  3. 你不需要那个正则表达式。

  4. string searchKeyword = "England";
    string fileName = @"C:\Users\karansha\Desktop\search tab.txt";
    string[] textLines = File.ReadAllLines(fileName);
    Dictionary<string,int> results = new Dictionary<string,int>;
    foreach (string line in textLines)
    {
        if (line.Contains(searchKeyword))
        {
            if(results.Keys.Any(searchKeyword))
            {
                results[searchKeyword]++;
            }
            else
            {
                results.Add(searchKeyword,1);
            }
            results.Add(line);
        }
    }
    
    foreach(var item in results)
    {
        Console.WriteLine("Team:"+item.Key +"\nPlayer Count:"+item.Value);
    }