【问题标题】:Convert Python 3.x snippet to C#/LINQ将 Python 3.x 代码段转换为 C#/LINQ
【发布时间】:2010-04-26 20:30:25
【问题描述】:

我想对HashSet<string> 的元素进行排序,并通过; 字符加入它们。

Python 解释器版本:

>>> st = {'jhg', 'uywer', 'nbcm', 'utr'}
>>> strng = ';'.join(sorted(s))
>>> strng
'ASD;anmbh;ashgg;jhghjg'

我寻求的方法的 C# 签名:

private string getVersionsSorted(HashSet<string> versions);

我可以不使用 Linq 做到这一点,但我真的想学得更好。

非常感谢!

【问题讨论】:

  • 谢谢大家;很难选择赢家。

标签: c# linq .net-3.5 python-3.x


【解决方案1】:

请注意,HashSet 是无序的。

简单较慢的版本:

String.Join(";", versions.OrderBy(v => v).ToArray());

自定义更快的版本:

versions.OrderBy(v => v).Join(";");

///<summary>Appends a list of strings to a StringBuilder, separated by a separator string.</summary>
///<param name="builder">The StringBuilder to append to.</param>
///<param name="strings">The strings to append.</param>
///<param name="separator">A string to append between the strings.</param>
public static StringBuilder AppendJoin(this StringBuilder builder, IEnumerable<string> strings, string separator) {
    if (builder == null) throw new ArgumentNullException("builder");
    if (strings == null) throw new ArgumentNullException("strings");
    if (separator == null) throw new ArgumentNullException("separator");

    bool first = true;

    foreach (var str in strings) {
        if (first)
            first = false;
        else
            builder.Append(separator);

        builder.Append(str);
    }

    return builder;
}
///<summary>Combines a collection of strings into a single string.</summary>
public static string Join(this IEnumerable<string> strings, string separator) { return new StringBuilder().AppendJoin(strings, separator).ToString(); }

可爱的快版

versions.OrderBy(v => v).Aggregate(new StringBuilder(), 
    (v, sb) => sb.Append(sb.Length > 0 ? ";" : "").Append(v)
).ToString();

.Net 4.0 最快版本:

String.Join(";", versions.OrderBy(v => v));

【讨论】:

    【解决方案2】:

    如果您可以选择使用 .NET 4.0,则可以从使用 SortedSet&lt;T&gt; 类开始,这将大大简化事情,因为您只需要在您的设备上调用 string.Join

    否则,如果您看起来受限于 .NET 3.5,请尝试以下操作:

    private string GetVersionsSorted(ISet<string> versions)
    {
        return string.Join(",", versions.OrderBy(s => s).ToArray());
    }
    

    (注意:如果您使用的是 .NET 4.0,也可以省略对 ToArray 的调用,这很方便。)

    【讨论】:

    • 酷 ... 很快切换到 4.0。
    • 顺便问一下,ISet 是从哪里来的?这就是 VS2008 中的帮助给我的: public class HashSet : ICollection, IEnumerable, IEnumerable, ISerializable, IDeserializationCallback
    • ISet&lt;T&gt; 是 .Net 4.0 的新手。
    • 哎呀,是的。 ISet&lt;T&gt; 也是 .NET 4.0 的新手...我忘记了我这些天写的代码有多少不能向后兼容早期版本的 .NET 嘿!不过你可以使用IEnumerable&lt;T&gt;...
    • @Hamish:原因与ICollection&lt;T&gt;IList&lt;T&gt; 类似。它代表所有类集合类的通用接口(契约)。当 BCL 得到 HashSet SortedSet 时,它变得特别重要,因此它们可以有一个共同的基础。
    【解决方案3】:
    HashSet<string> hash = new HashSet<string>(new string[] { "b", "a", "d" });
    string output = hash.OrderBy(str => str).Aggregate((a, b) => a + ";" + b);
    

    输出:a;b;d

    【讨论】:

      【解决方案4】:
      var versions = new HashSet<string>(new[] { "jhg", "uywer", "nbcm", "utr" });
      var result = string.Join(";", versions.OrderBy(x => x).ToArray());
      Console.WriteLine(result);
      

      【讨论】:

      • 请在投反对票时发表评论,如果您觉得答案有问题,最好修改答案。
      • 老实说,我不确定您的回答为什么被否决。我觉得没问题。
      猜你喜欢
      • 2023-03-20
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      相关资源
      最近更新 更多