c#获取HashSet的特定元素

teq*_*ras 2 c# hashset

我只想在它包含特定字符串的情况下获取HashSet的元素.我尝试了下面的代码,但我没有得到任何东西......就像没有匹配.但是这种情况不会发生,因为UnKnown计数器始终为0.

if (!IsbnAuth.Contains(RecTitle))
{
    Unknown++;
}
else
{
    for (int i = 0; i < IsbnAuth.Count(); i++)
    {
        if (IsbnAuth.ElementAt(i).Contains(RecTitle))
        {
            System.Console.WriteLine(IsbnAuth.ElementAt(i));
            //isbn = IsbnAuth.ElementAt(i).Substring(0, IsbnAuth.ElementAt(i).IndexOf("\t"));
            isbn = IsbnAuth.ElementAt(i).Split(' ')[0];
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?问题不在RecTitle原因,即使它只是一个char,结果也是一样的.IsbnAuth是HashSet.

编辑:IsbnAuth声明

    HashSet<String> IsbnAuth = new HashSet<String>();
    foreach (String line in IsbnAuthors)
    {
        IsbnAuth.Add(line.Trim());
    }
    System.Console.WriteLine(IsbnAuth.Count);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

这是第一个问题:

if (!IsbnAuth.Contains(RecTitle))
{
    Unknown++;
}
Run Code Online (Sandbox Code Playgroud)

检查集合是否包含整个字符串,作为完整元素.听起来好像没有.

我怀疑你真的想要:

bool found = false;
foreach (String element in IsbnAuth)
{
    if (element.Contains(RecTitle))
    {
        isbn = element.Split(' ')[0];
        found = true;
        break;
    }
}
if (!found)
{
    Unknown++;
}
Run Code Online (Sandbox Code Playgroud)

甚至更好:

string isbn = IsbnAuth.Where(x => x.Contains(RecTitle))
                      .Select(x => x.Split(' ')[0])
                      .FirstOrDefault();
if (isbn == null)
{
    Unknown++;
}
Run Code Online (Sandbox Code Playgroud)

值得注意的是,a HashSet处于一个根本不可预测的顺序 - 所以如果这里有多个匹配,你最终会得到任意结果.这真的是你想要的吗?