可以迭代数组,然后逐个向hashset添加元素。有没有办法将int数组中的整数添加到int hashset而不迭代数组元素?
int[] pagesid;//int array
var deletepages = new HashSet<int>();//hashset
pagesid= Array.ConvertAll(text.Split(','), s=>int.Parse(s));
//values from pagesid should be added to hashset.
更新
int[] pagesid;//int array
var deletepages = new HashSet<int>();//hashset
foreach (XmlNode rule in pgmgmtrules)
{
ruleresult=doc.ParseText(rule.InnerText, false);//parse rule
if (ruleresult != "")
{ //if parsed rule result has value
if (rule.Attributes["Action"].Value == "Delete")
{
var text=rule.Attributes["pageids"].Value;
pagesid= Array.ConvertAll(text.Split(','), s=>int.Parse(s));
//add elements from pagesid array to hashset
}
}
}
答案 0 :(得分:2)
您可以使用重载的构造函数HashSet Constructor (IEnumerable),它将IEnumerable<T>
作为参数,而不是使用默认构造函数HashSet<T>()
。
HashSet<int> evenNumbers = new HashSet<int>(text.Split(',').Select(int.Parse));
HashSet Constructor (IEnumerable)
初始化使用的HashSet类的新实例 集合类型的默认相等比较器,包含复制的元素 来自指定的集合,并具有足够的容量 容纳复制的元素数量。
编辑1 如果您想从数组中过滤偶数,那么您可以使用Where
var intArr = text.Split(',').Select(int.Parse);
HashSet<int> evenNumbers = new HashSet<int>(intArr.Where(i=>i%2==0));
编辑2 根据评论。您可以使用List<int>
而不是int数组。保持在循环中的List
中添加int pagesid以及 loop 完成后,通过其构造函数HashSet Constructor (IEnumerable)在List
中添加HashSet
。
List<int> pagesid = new List<int>();//int array
HashSet<int> deletepages = null;
foreach (XmlNode rule in pgmgmtrules)
{
ruleresult=doc.ParseText(rule.InnerText, false);//parse rule
if (ruleresult != "")
{ //if parsed rule result has value
if (rule.Attributes["Action"].Value == "Delete")
{
var text=rule.Attributes["pageids"].Value;
pagesid.AddRange(text.Split(',').Select(int.Parse));
}
}
}
//add elements from pagesid array to hashset
deletepages = new HashSet<int>(pagesid);
答案 1 :(得分:0)
没有办法 - 即使LINQ也没有帮助:
sids = text.Split(',') // It is still array no matter what use
.Select(str => int.Parse(s)); // This is where the loop over the array actually works
deletePages = new HashSet<int>()(sids);
由于String.Split
无论如何都会创建数组 - http://msdn.microsoft.com/en-us/library/b873y76a(v=vs.110).aspx。
但是如果您创建自己的流式字符串拆分器而不是:
var deletePages = new HashSet<int>();//hashset
sids = text.MyStreamingStringSplit(',')
.Select(str => int.Parse(s));
var deletePages = new HashSet<int>(sids );//hashset
您的流式传输字符串解析器可能如下所示:
public static class StringExtensions
{
public static IEnumerable<String> StreamSplit(this String thisStr, char splitChar)
{
if (thisStr == null)
throw new ArgumentNullException();
Int32 lastSplitterIndex = -1;
for (Int32 i = 0; i < thisStr.Length; i++)
{
if (thisStr[i] == splitChar)
{
yield return thisStr.Substring(lastSplitterIndex + 1, i - lastSplitterIndex - 1);
lastSplitterIndex = i;
}
}
yield return thisStr.Substring(lastSplitterIndex + 1);
}
}
但是性能只有很小(如果有的话)。所以我认为您应该继续使用原始解决方案 - 只需使用HashSet<T>(IEnumerable<T>)
构造函数。
答案 2 :(得分:0)
HashSet有一个constructor,它接受一个可枚举的输入。你可以写一些简单的东西:
var ints=text.Split(',')
.Select(s=>int.Parse(s));
var set-new HashSet(ints);
大多数内置泛型集合都接受IEnumerable作为源代码,因此您不必手动迭代源代码。
<强>更新强>
从另一条评论来看,代码似乎会在循环中运行,而text
实际上是要处理的当前字符串。
在这种情况下,更容易打破循环,创建所有文本的单个可枚举,然后进行转换,例如:
var lines=new [] {"123,123","234,456"};
var ints=from line in lines
from s in line.Split(',')
select int.Parse(s);
var set=new HashSet(ints);
或
var ints=lines.SelectMany(line=>line.Split(','))
.Select(s=>int.Parse(s));
var set-new HashSet(ints);
例如,以下代码段解析文件中的所有数字:
var lines=File.ReadAllLines(filePath);
var ints=from line in lines
from s in line.Split(',')
select int.Parse(s);
var set-new HashSet(ints);
答案 3 :(得分:0)
从你的int数组中尝试这个简单的方法
int[] pagesid;//int array
var deletepages = new HashSet<int>();//hashset
pagesid = Array.ConvertAll("3,5,6,7".Split(','), s => int.Parse(s));
//values from pagesid should be added to hashset.
var hashset = new HashSet<int>(pagesid);