Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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#列表<&燃气轮机;按字母顺序排列的订单ABCABC而非AABBCC_C#_Linq_Sorting - Fatal编程技术网

C#列表<&燃气轮机;按字母顺序排列的订单ABCABC而非AABBCC

C#列表<&燃气轮机;按字母顺序排列的订单ABCABC而非AABBCC,c#,linq,sorting,C#,Linq,Sorting,我需要根据对象的一个属性对对象列表进行排序。我已经找到了各种各样的答案,但没有一个是按照我需要的方式排序的。我试图排序的属性名为“DrawingName”。 我需要将列表按如下顺序排列: “411000A”、“411000B”、“411000C”、“411000D”、“411000A”、“411000B”、“411000C”、“411000D” 相反,我得到: “411000A”、“411000A”、“411000B”、“411000B”、“411000C”、“411000C”、“411000D

我需要根据对象的一个属性对对象列表进行排序。我已经找到了各种各样的答案,但没有一个是按照我需要的方式排序的。我试图排序的属性名为“DrawingName”。 我需要将列表按如下顺序排列:
“411000A”、“411000B”、“411000C”、“411000D”、“411000A”、“411000B”、“411000C”、“411000D”

相反,我得到:
“411000A”、“411000A”、“411000B”、“411000B”、“411000C”、“411000C”、“411000D”、“411000D”

当我使用以下代码时

List<DrawingData> _DrawingList = new List<DrawingData>();

_DrawingList.Add(new DrawingData() { DrawingName = "411000D", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000D", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000A", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000A", DrawingQty = 1 });        
_DrawingList.Add(new DrawingData() { DrawingName = "411000C", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000C", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000B", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000B", DrawingQty = 1 });

_DrawingList.OrderBy(dn => dn.DrawingName);

var _DrawingListInOrder = _DrawingList.OrderBy(dwg => dwg.DrawingName);
List_DrawingList=newlist();
_添加(新的DrawingData(){DrawingName=“411000D”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000D”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000A”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000A”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000C”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000C”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000B”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000B”,DrawingQty=1});
_DrawingList.OrderBy(dn=>dn.DrawingName);
var\u drawinglistinoorder=\u DrawingList.OrderBy(dwg=>dwg.DrawingName);

完成一次,并计算到目前为止每个
DrawingName出现的次数:

411000D 0x
411000D 1x
411000A 0x
411000A 1x
411000C 0x
411000C 1x
411000D 2x
411000B 0x
411000B 1x
然后,您可以按事件和字母顺序对它们进行排序

411000A 0x
411000B 0x
411000C 0x
411000D 0x
411000A 1x
411000B 1x
411000C 1x
411000D 1x
411000D 2x

进行一次传递并计算到目前为止每个
DrawingName
的出现次数:

411000D 0x
411000D 1x
411000A 0x
411000A 1x
411000C 0x
411000C 1x
411000D 2x
411000B 0x
411000B 1x
然后,您可以按事件和字母顺序对它们进行排序

411000A 0x
411000B 0x
411000C 0x
411000D 0x
411000A 1x
411000B 1x
411000C 1x
411000D 1x
411000D 2x

假设这用于相对较少的数据量,以下伪代码可能满足您的需要:

Take the list L of things to sort
Sort L normally (AABBCCDD order)
Create an empty list L2 and an empty set S
While L still has elements:
    Iterate over L
        If current element E is in S, ignore it
        Otherwise, add E to S, add it to the end of L2 and remove it from L
    Clear S

在此之后,
L2
应具有ABCDABCD顺序的元素。

假设这用于相对少量的数据,以下伪代码可能满足您的需要:

Take the list L of things to sort
Sort L normally (AABBCCDD order)
Create an empty list L2 and an empty set S
While L still has elements:
    Iterate over L
        If current element E is in S, ignore it
        Otherwise, add E to S, add it to the end of L2 and remove it from L
    Clear S
在此之后,
L2
应将元素按ABCDABCD顺序排列。

尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;

class DrawingData {
    public string DrawingName{get;set;} 
    public int DrawingQty {get;set;}
}

class DrawingDataComparer : IEqualityComparer<DrawingData>
{

    public bool Equals(DrawingData d1, DrawingData d2)
    {
        return d1.DrawingName.Equals(d2.DrawingName);
    }


    public int GetHashCode(DrawingData d)
    {
        return d.DrawingName.GetHashCode();
    }

}

public class Test
{
    public static void Main()
    {
        List<DrawingData> _DrawingList = new List<DrawingData>();
        _DrawingList.Add(new DrawingData() { DrawingName = "411000D", DrawingQty = 1 });
        _DrawingList.Add(new DrawingData() { DrawingName = "411000D", DrawingQty = 1 });
        _DrawingList.Add(new DrawingData() { DrawingName = "411000A", DrawingQty = 1 });
        _DrawingList.Add(new DrawingData() { DrawingName = "411000A", DrawingQty = 1 });        
        _DrawingList.Add(new DrawingData() { DrawingName = "411000C", DrawingQty = 1 });
        _DrawingList.Add(new DrawingData() { DrawingName = "411000C", DrawingQty = 1 });
        _DrawingList.Add(new DrawingData() { DrawingName = "411000B", DrawingQty = 1 });
        _DrawingList.Add(new DrawingData() { DrawingName = "411000B", DrawingQty = 1 });

        _DrawingList = _DrawingList.OrderBy(c => c.DrawingName).ToList();
        var distinct = _DrawingList.Distinct(new DrawingDataComparer());
        var organized = distinct.Concat(_DrawingList.Except(distinct));
        foreach(DrawingData dd in organized)
            Console.WriteLine(dd.DrawingName);
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
类DrawingData{
公共字符串DrawingName{get;set;}
public int DrawingQty{get;set;}
}
类DrawingDataComparer:IEqualityComparer
{
公共布尔等于(DrawingData d1,DrawingData d2)
{
返回d1.DrawingName.Equals(d2.DrawingName);
}
公共整数GetHashCode(DrawingData d)
{
返回d.DrawingName.GetHashCode();
}
}
公开课考试
{
公共静态void Main()
{
列表_DrawingList=新列表();
_添加(新的DrawingData(){DrawingName=“411000D”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000D”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000A”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000A”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000C”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000C”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000B”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000B”,DrawingQty=1});
_DrawingList=_DrawingList.OrderBy(c=>c.DrawingName.ToList();
var distinct=_DrawingList.distinct(新的DrawingDataComparer());
var organized=distinct.Concat(_DrawingList.Except(distinct));
foreach(有组织的DrawingData dd)
控制台写入线(dd.DrawingName);
}
}
试试这个:

using System;
using System.Collections.Generic;
using System.Linq;

class DrawingData {
    public string DrawingName{get;set;} 
    public int DrawingQty {get;set;}
}

class DrawingDataComparer : IEqualityComparer<DrawingData>
{

    public bool Equals(DrawingData d1, DrawingData d2)
    {
        return d1.DrawingName.Equals(d2.DrawingName);
    }


    public int GetHashCode(DrawingData d)
    {
        return d.DrawingName.GetHashCode();
    }

}

public class Test
{
    public static void Main()
    {
        List<DrawingData> _DrawingList = new List<DrawingData>();
        _DrawingList.Add(new DrawingData() { DrawingName = "411000D", DrawingQty = 1 });
        _DrawingList.Add(new DrawingData() { DrawingName = "411000D", DrawingQty = 1 });
        _DrawingList.Add(new DrawingData() { DrawingName = "411000A", DrawingQty = 1 });
        _DrawingList.Add(new DrawingData() { DrawingName = "411000A", DrawingQty = 1 });        
        _DrawingList.Add(new DrawingData() { DrawingName = "411000C", DrawingQty = 1 });
        _DrawingList.Add(new DrawingData() { DrawingName = "411000C", DrawingQty = 1 });
        _DrawingList.Add(new DrawingData() { DrawingName = "411000B", DrawingQty = 1 });
        _DrawingList.Add(new DrawingData() { DrawingName = "411000B", DrawingQty = 1 });

        _DrawingList = _DrawingList.OrderBy(c => c.DrawingName).ToList();
        var distinct = _DrawingList.Distinct(new DrawingDataComparer());
        var organized = distinct.Concat(_DrawingList.Except(distinct));
        foreach(DrawingData dd in organized)
            Console.WriteLine(dd.DrawingName);
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
类DrawingData{
公共字符串DrawingName{get;set;}
public int DrawingQty{get;set;}
}
类DrawingDataComparer:IEqualityComparer
{
公共布尔等于(DrawingData d1,DrawingData d2)
{
返回d1.DrawingName.Equals(d2.DrawingName);
}
公共整数GetHashCode(DrawingData d)
{
返回d.DrawingName.GetHashCode();
}
}
公开课考试
{
公共静态void Main()
{
列表_DrawingList=新列表();
_添加(新的DrawingData(){DrawingName=“411000D”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000D”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000A”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000A”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000C”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000C”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000B”,DrawingQty=1});
_添加(新的DrawingData(){DrawingName=“411000B”,DrawingQty=1});
_DrawingList=_DrawingList.OrderBy(c=>c.DrawingName.ToList();
var distinct=_DrawingList.distinct(新的DrawingDataComparer());
var organized=distinct.Concat(_DrawingList.Except(distinct));
foreach(有组织的DrawingData dd)
控制台写入线(dd.DrawingName);
}
}

并不是说这是最有效的方法,但它确实有效:

List<DrawingData> _DrawingList = new List<DrawingData>();

_DrawingList.Add(new DrawingData() { DrawingName = "411000D", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000D", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000A", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000A", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000C", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000C", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000B", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000B", DrawingQty = 1 });

var _WithIndex = _DrawingList.Select(x => new { DrawingData = x, Index = _DrawingList.Where(y => y.DrawingName == x.DrawingName).ToList().IndexOf(x) });
var _FinalOrder = _WithIndex.OrderBy(x => x.Index).ThenBy(x => x.DrawingData.DrawingName).Select(x => x.DrawingData);

Console.WriteLine("Final Sort:");
Console.WriteLine(string.Join("\n", _FinalOrder));

Console.ReadLine();

并不是说这是最有效的方法,但它是有效的:

List<DrawingData> _DrawingList = new List<DrawingData>();

_DrawingList.Add(new DrawingData() { DrawingName = "411000D", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000D", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000A", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000A", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000C", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000C", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000B", DrawingQty = 1 });
_DrawingList.Add(new DrawingData() { DrawingName = "411000B", DrawingQty = 1 });

var _WithIndex = _DrawingList.Select(x => new { DrawingData = x, Index = _DrawingList.Where(y => y.DrawingName == x.DrawingName).ToList().IndexOf(x) });
var _FinalOrder = _WithIndex.OrderBy(x => x.Index).ThenBy(x => x.DrawingData.DrawingName).Select(x => x.DrawingData);

Console.WriteLine("Final Sort:");
Console.WriteLine(string.Join("\n", _FinalOrder));

Console.ReadLine();

从我对需求的理解来看,您需要订购每个唯一的集合。所以,拿一套独特的,订购,并保存它。然后把你刚用过的拿出来,再做一次。继续,直到您没有更多的独特的设置订单

List<DrawingData> ordered = new List<DrawingData>();
while (_DrawingList.Any())
{
    var temp = _DrawingList.Distinct().OrderBy(dd => dd.DrawingName, StringComparer.CurrentCultureIgnoreCase);
    ordered.AddRange(temp);
    foreach (var remove in temp)
    {
        _DrawingList.Remove(remove);
    }
}
_DrawingList = ordered;

从我对需求的理解来看,您需要订购每个唯一的集合。所以,拿一套独特的,订购,并保存它。然后把你刚用过的拿出来,再做一次。继续,直到您没有更多的独特的设置订单

List<DrawingData> ordered = new List<DrawingData>();
while (_DrawingList.Any())
{
    var temp = _DrawingList.Distinct().OrderBy(dd => dd.DrawingName, StringComparer.CurrentCultureIgnoreCase);
    ordered.AddRange(temp);
    foreach (var remove in temp)
    {
        _DrawingList.Remove(remove);
    }
}
_DrawingList = ordered;

假设要将重复项拆分为单独的lis
public static IEnumerable<IEnumerable<T>> Transpose<T>(this IEnumerable<IEnumerable<T>> @this) 
{
    var enumerators = @this.Select(t => t.GetEnumerator())
                           .Where(e => e.MoveNext()).ToList();

    while (enumerators.Any()) {
        yield return enumerators.Select(e => e.Current);
        enumerators = enumerators.Where(e => e.MoveNext()).ToList();
    }
}
var result = data.GroupBy(d => d)
                 .SelectMany(g => g.Select((item, indexer) => new { item, indexer}))
                 .OrderBy(a => a.indexer)
                 .ThenBy(a => a.item)
                 .Select(a => a.item);
public static class GroupExtender
{
    public static IEnumerable<T> Mix<T>(this IEnumerable<IEnumerable<T>> groups)
    {
        // enumerate once
        var enumerable = groups as IList<IEnumerable<T>> ?? groups.ToList(); 
        //stop case
        if (!(enumerable.Any(g=>g.Any())))
            return new List<T>();
        // get first elements, iterate over the IEnumerable trimmed of these
        return enumerable
                .SelectMany(g => g.Take(1))
                .Concat(enumerable.Select(g => g.Skip(1)).Mix());
    }
}
var _DrawingListInOrder = 
      _DrawingList.GroupBy(x => x.DrawingName).OrderBy(g => g.Key).Mix();