c#获取HashSet的特定元素

本文关键字:元素 获取 HashSet | 更新日期: 2023-09-27 18:15:03

我想获得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;
        }
    }
}

任何想法?问题不在于RecTitle原因,即使它只是一个字符,结果将是相同的。IsbnAuth是HashSet。

编辑:IsbnAuth声明

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

c#获取HashSet的特定元素

第一个问题:

if (!IsbnAuth.Contains(RecTitle))
{
    Unknown++;
}

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

我怀疑你真的想:

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

或者更好:

string isbn = IsbnAuth.Where(x => x.Contains(RecTitle))
                      .Select(x => x.Split(' ')[0])
                      .FirstOrDefault();
if (isbn == null)
{
    Unknown++;
}
值得注意的是,HashSet的顺序基本上是不可预测的——因此,如果这里有多个匹配,您将最终得到一个任意的结果。这是你想要的吗?

在我看来,您在您的Hastable中的一个字符串中存储了多个信息。我会这样做:

public class Info
{
    public string ISBN { get; set; }
    public string Title { get; set; }
}

后面的代码:

List<Info> isbnAuth = new List<Info>();
foreach (String line in IsbnAuthors)      
{ 
    isbnAuth.Add(new Info { ISDN = line.Split(' ')[0], Title = line.Split(' ')[1] });
}

你可以像这样搜索一个项目:

var itemFound = isbnAuth.FirstOrDefault(item => item.Title == RecTitle);
if (itemFound != null)
{
    isbn = itemFound.ISBN;
}