C#HashSet<;字符串>;单串

C#HashSet<;字符串>;单串,c#,C#,我有一个定期添加到中的哈希集。我要做的是将整个HashSet转换为字符串,而不执行foreach循环。有人举过一个例子吗?不管你是否明确地写了一个例子,你都会循环内容 但是,如果不使用显式编写,并且如果“cast”的意思是“concatenate”,那么您将编写如下内容 string output = string.Join("", yourSet); // .NET 4.0 string output = string.Join("", yourSet.ToArray()); // .NET

我有一个定期添加到中的
哈希集。我要做的是将整个HashSet转换为字符串,而不执行foreach循环。有人举过一个例子吗?

不管你是否明确地写了一个例子,你都会循环内容

但是,如果不使用显式编写,并且如果“cast”的意思是“concatenate”,那么您将编写如下内容

string output = string.Join("", yourSet); // .NET 4.0
string output = string.Join("", yourSet.ToArray()); // .NET 3.5

如果您想要一个字符串,它是HashSet中值的串联,这应该可以工作

class Program
{
    static void Main(string[] args)
    {
        var set = new HashSet<string>();
        set.Add("one");
        set.Add("two");
        set.Add("three");
        var count = string.Join(", ", set);
        Console.WriteLine(count);
        Console.ReadKey();
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var set=新的HashSet();
设置。添加(“一”);
加上(“两”);
增加(“三”);
var count=string.Join(“,”,set);
控制台写入线(计数);
Console.ReadKey();
}
}

如果希望一个方法连接所有哈希集的项,可以创建一个扩展方法

[]的

[TestClass]
公共类UnitTest1
{
[测试方法]
公共void TestMethod1()
{
HashSet HashSet=新的HashSet();
添加(“AAA”);
添加(“BBB”);
添加(“CCC”);
AreEqual(“aaabbccc”,hashset.AllToString());
}
}
公共静态类HashSetExtensions
{
公共静态字符串AllToString(此哈希集)
{           
锁(哈希集)
{
StringBuilder sb=新的StringBuilder();
foreach(hashset中的var项)
某人附加(项目);
使某人返回字符串();
}
}
} 
您可以使用Linq:

hashSet.Aggregate((a,b)=>a+" "+b)

哪个选项在哈希集的两个元素之间插入一个空格

单个字符串?就像在连接值时一样?我对一些事情很好奇。我见过几十个这样的问题,“我想做一些显然需要循环的事情,但我不想使用循环”。为什么?人们对循环的仇恨从何而来?我认为人们希望提高代码的语义清晰度。如果您有
mySet.ItemsAsOneBigString()
而不是
StringBuilder sb=new StringBuilder();foreach(myset中的字符串s)sb.append(s);使某人返回字符串()是的,它很小,但其他许多C#语法和框架糖“立方体”也很小。)这使代码更易于阅读和确定意图。@Eric我看到很多人读了一些关于Big-O表示法的书,觉得“我需要不惜一切代价避免循环,因为它们很慢”,并且不知何故假设框架有一些避免循环的神奇大容量内存拷贝方法。不是说迈克是这些人中的一员,但我见过他们。@Michael:这个框架并不神奇。如果您必须多次执行相同的操作,则其中可能存在循环或递归。+1,但值得注意的是.NET 3.5版本比显式循环“更差”:它需要两次数据传递(一次用于
ToArray
调用,一次用于
Join
调用)和额外分配(由
ToArray
生成的数组)。我喜欢@Brian的答案——它甚至可以让您控制循环在值之间应该放置什么:string.Join(“,”,set)。是否有性能原因选择上面的4.0语法?
hashSet.Aggregate((a,b)=>a+" "+b)