Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对IEnumerable进行排序<;字符串>;_C#_.net_String_Sorting_Ienumerable - Fatal编程技术网

C# 如何对IEnumerable进行排序<;字符串>;

C# 如何对IEnumerable进行排序<;字符串>;,c#,.net,string,sorting,ienumerable,C#,.net,String,Sorting,Ienumerable,如何按字母顺序对IEnumerable进行排序。这可能吗 编辑:如何编写就地解决方案?与对任何其他可枚举项进行排序的方式相同: var result = myEnumerable.OrderBy(s => s); 或 或(忽略案例) 注意,与LINQ一样,这会创建一个新的IEnumerable,当枚举时,它会按排序顺序返回原始IEnumerable的元素。它没有对IEnumerable进行适当的排序 IEnumerable是只读的,也就是说,您只能从中检索元素,但不能直接修改它。如果要

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


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

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

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

或(忽略案例)

注意,与LINQ一样,这会创建一个新的IEnumerable,当枚举时,它会按排序顺序返回原始IEnumerable的元素。它没有对IEnumerable进行适当的排序


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

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

或者(如果以后要向列表中添加更多项目并保持其排序)


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

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


这意味着您将丢失
IEnumerable的“continue infinitely”属性,但您无论如何也无法对其进行排序。

我们无法始终在适当的位置执行此操作,但我们会在可能的情况下检测:

myEnumerable = myEnumerable.OrderBy(s => s);
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);
}
IEnumerable SortInPlaceIfCan(IEnumerable src,IComparer cmp)
{
List listToSort=(src是List)?(List)src:新列表(src);
listToSort.Sort(cmp);
返回listToSort;
}
IEnumerable SortInPlaceIfCan(IEnumerable src,比较cmp)
{
返回SortInPlaceIfCan(src,newfunccomparer(cmp));
}
IEnumerable SortInPlaceIfCan(IEnumerable src)
{
返回SortInPlaceIfCan(src,Comparer.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);
  }
}
内部结构FuncComparer:IComparer
{
私有只读比较;
公共函数比较器(比较cmp)
{
_cmp=cmp;
}
公共整数比较(TX,TY)
{
返回cmp(x,y);
}
}

或myEnumerable.OrderByDescending(s=>s).So,\u components=\u components.OrderBy(s=>s);好吗?@CatZilla:那应该行,但可能不是解决你实际问题的最好办法。什么是_components,从何处获取,如何使用?@dtb:Oh,_components是通过XML文件精确填充的:_components=(从XML.subjects(“component”)中的c选择c.Value.ToString()).Distinct().ToList();我需要对它进行排序。
OrderBy
返回
iorderenumerable
IOrderedEnumerable
源于
IEnumerable
,因此它可以像
IEnumerable
一样使用,但它扩展了类型,例如允许使用
ThenBy
。IEnumerable的目的是为您提供一个系列的句柄,您可以通过继续请求“下一个”项从头到尾进行迭代。这意味着一个IEnumerable可以在所有内容都已知之前进行部分迭代;你不必知道什么时候你已经经历了所有这些,直到你经历了。排序(就像Linq允许您做的许多事情一样)需要了解整个序列作为有序列表的知识;排序序列中最先出现的项目可能是序列返回的最后一个项目,除非您知道所有项目都是什么,否则您不会知道。我不确定是否推荐此项。如果您有一个IEnumerable,但不知道实现的实际类型,那么您可能不应该修改它。顺便说一句,Array.FunctorComparer是内部的;这意味着它。这是在方法名称中使用“InPlaceInga”的原因;方法名称可以比最佳文档更直接地反映风险;)是的,Array.FunctorComparer是内部的,但它很简单。我之所以把它放进去,是因为这是我在“你的函子比较器”示例中所能想到的最好的方法。你的助手类集合中有@dtb,经过再三考虑,改为使用我自己的(再次查看了Array.FunctorComparer,我更喜欢我的!)聪明的想法和命名!但是,为什么在
listToSort=(src是List)中使用这个函数呢?(列表)src:新列表(src)?让它像
listToSort=(src as List)那样怎么样;如果(null==listToSort)listToSort=新列表(src)@jeroenviertplaimers示例代码也总是存在问题;也许我只是没有费心,因为上面的内容略短,我想专注于手头的事情,但即使是在例子中,劝阻坏习惯也是好的。
_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();
myEnumerable = myEnumerable.OrderBy(s => s);
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);
  }
}