0

假设有这样的行:

英格兰 A 队队员:Flintoff
英格兰 A 队队员:Flintoff
英格兰 B 队队员:施特劳斯
英格兰 A 队队员:施特劳斯
印度队队员 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

4 回答 4

1

A simpler way would be to use 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();

As noted by @DominicKexel I swept the foreach

于 2013-03-01T13:41:20.190 回答
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();

那会给你独特的线条,你需要分裂,你可以很容易地做到这一点。你可以知道有多少独特的计数。

于 2013-03-01T13:43:27.700 回答
0

如果您不喜欢 Regex 方法,您可以将值(例如“England player: Foo”)添加到 Dictionary 对象,使值成为键,这样就不会添加重复项,然后使用 Count 方法。另请参见ContainsKey方法。

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

于 2013-03-01T13:44:07.723 回答
0
  1. 您需要检查您的列表是否已经包含关键字
  2. 使用字典集合。
  3. 你不需要那个正则表达式的东西。

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);
}
于 2013-03-01T13:44:09.930 回答