从int数组添加元素到int hashset

时间:2014-06-20 11:18:12

标签: c# asp.net arrays hashset

可以迭代数组,然后逐个向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

    }
  }
}

4 个答案:

答案 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);