0

プロパティの 1 つに基づいてオブジェクトのリストを並べ替える必要があります。私はあらゆる種類の答えを見つけましたが、必要な方法で注文するものはありません。注文しようとしているプロパティは「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);
4

8 に答える 8

2

これが最も効率的な方法であるとは言いませんが、機能します:

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();

複製された各アイテムのインデックスを取得し、そのインデックスで並べ替え、次に名前で並べ替えます。

少しシンプルにしました。単一の LINQ ステートメントにすることができます。

var _FinalOrder = _DrawingList
    .Select(x => new
        {
            DrawingData = x,
            Index = _DrawingList.Where(y => y.DrawingName == x.DrawingName)
                                .ToList()
                                .IndexOf(x)
        })
    .OrderBy(x => x.Index)
    .ThenBy(x => x.DrawingData.DrawingName)
    .Select(x => x.DrawingData);
于 2013-10-04T13:30:27.933 に答える
0

最適ではありませんが、 IEnumerable> での再帰的な拡張メソッドは、使用するのが楽しく、 grouping 以外のより一般的なケースで役立つ場合があります。

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();
于 2013-10-04T15:04:46.930 に答える
0

これを試して:

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);
    }
}
于 2013-10-04T13:29:23.400 に答える
0

グループ化とそれに続く転置を探しています。

string[] data = 
{
    "411000D", 
    "411000D", 
    "411000A",
    "411000A",        
    "411000C",
    "411000C",
    "411000B",
    "411000B"
};

var grouped = data.GroupBy(d => d).OrderBy(g => g.Key).ToList().Transpose();
String.Join(",", grouped.SelectMany(f => f));

結果は

411000A,411000B,411000C,411000D,411000A,411000B,411000C,411000D

という名前の次の拡張メソッドが与えられた場合Transpose:

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();
    }
}

Karel Frajtakの提案を実装する別のアプローチ:

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);
于 2013-10-04T13:47:44.953 に答える