我想获取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原因,即使它只是一个char,结果也是一样的。 IsbnAuth是HashSet。
编辑:IsbnAuth声明
HashSet<String> IsbnAuth = new HashSet<String>();
foreach (String line in IsbnAuthors)
{
IsbnAuth.Add(line.Trim());
}
System.Console.WriteLine(IsbnAuth.Count);
答案 0 :(得分:9)
这是第一个问题:
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 :(得分:1)
在我看来,你在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;
}