c # получить конкретный элемент HashSet - PullRequest
2 голосов
/ 17 ноября 2011

Я хочу получить элемент 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);

Ответы [ 2 ]

9 голосов
/ 17 ноября 2011

Это первая проблема:

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 находится в принципиально непредсказуемом порядке - поэтому, если здесь есть несколько совпадений, вы получите произвольный результат.Вы действительно этого хотите?

1 голос
/ 17 ноября 2011

Мне кажется, что вы храните множество данных, хранящихся в одной строке, в вашей таблице.Я бы сделал это следующим образом:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...