如何对IEnumerable <string> </string>进行排序

时间:2010-09-02 19:51:50

标签: c# .net string sorting ienumerable

如何按字母顺序对IEnumerable<string>进行排序。这可能吗?

编辑:我如何编写就地解决方案?

4 个答案:

答案 0 :(得分:137)

与排序任何其他可枚举的方式相同:

var result = myEnumerable.OrderBy(s => s);

var result = from s in myEnumerable
             orderby s
             select s;

或(忽略大小写)

var result = myEnumerable.OrderBy(s => s,
                                  StringComparer.CurrentCultureIgnoreCase);

注意,与LINQ一样,这会创建一个新的IEnumerable&lt; T&gt;。当枚举时,返回原始IEnumerable&lt; T&gt;的元素。按排序顺序。它不对IEnumerable&lt; T&gt;进行排序。在的地方。


IEnumerable&lt; T&gt;是只读的,也就是说,您只能从中检索元素,但不能直接修改它。如果要对就地的字符串集合进行排序,则需要对实现IEnumerable&lt; string&gt;的原始集合进行排序,或者转换IEnumerable&lt; string&gt;首先进入可排序的集合:

List<string> myList = myEnumerable.ToList();
myList.Sort();

根据您的评论:

_components = (from c in xml.Descendants("component")
               let value = (string)c
               orderby value
               select value
              )
              .Distinct()
              .ToList();

_components = xml.Descendants("component")
                 .Select(c => (string)c)
                 .Distinct()
                 .OrderBy(v => v)
                 .ToList();

或(如果您希望稍后将更多项目添加到列表中并保持其排序)

_components = xml.Descendants("component")
                 .Select(c => (string)c)
                 .Distinct()
                 .ToList();

_components.Add("foo");
_components.Sort();

答案 1 :(得分:9)

这是不可能的,但事实并非如此。

基本上,任何排序方法都会将您的IEnumerable复制到List,对List进行排序,然后返回排序列表,即IEnumerable以及IList

这意味着你失去了IEnumerable的“继续无限”属性,但是无论如何你也无法对它进行排序。

答案 2 :(得分:8)

myEnumerable = myEnumerable.OrderBy(s => s);

答案 3 :(得分:2)

我们不能总是在现场进行,但我们会检测何时可能:

IEnumerable<T> SortInPlaceIfCan(IEnumerable<T> src, IComparer<T> cmp)
{
  List<T> listToSort = (src is List<T>) ? (List<T>)src : new List<T>(src);
  listToSort.Sort(cmp);
  return listToSort;
}
IEnumerable<T> SortInPlaceIfCan(IEnumerable<T> src, Comparison<T> cmp)
{
  return SortInPlaceIfCan(src, new FuncComparer<T>(cmp));
}
IEnumerable<T> SortInPlaceIfCan(IEnumerable<T> src)
{
  return SortInPlaceIfCan(src, Comparer<T>.Default);
}

这使用以下方便的结构:

internal struct FuncComparer<T> : IComparer<T>
{
  private readonly Comparison<T> _cmp;
  public FuncComparer(Comparison<T> cmp)
  {
      _cmp = cmp;
  }
  public int Compare(T x, T y)
  {
      return _cmp(x, y);
  }
}