1

これは難しそうに見えますが、できる限りの助けや支援をいただければ幸いです。

リストがあります、リスト。各 Car オブジェクトにはリスト List があります。車のリストをこれらのアクセサリの 1 つで並べ替えたいと思います。私の例では、見つけようとしているアクセサリを備えたいくつかの Car オブジェクトがあることが保証されています。

アクセサリの名前はわかりましたが、車のリストをアクセサリの名前で並べ替えるために使用する構文がわかりません。

  • AccessoriesObj1 => 名前 (文字列: ダイナミック ステアリング)
  • AccessoriesObj2 => 名前 (文字列: サイドアシスト)

  • Car1 -> リスト (AccessoryObj1、AccessoryObj2、AccessoryObj3)

  • Car2 -> リスト (AccessoryObj1、AccessoryObj2、AccessoryObj3)

リスト (Car1、Car2)

私が試した構文は次のとおりです。

String sortField = "Side Assist";
List<Car> sortedList = sortedList.OrderBy(
                        x => x.Accessories.OfType<Accessory>().ToList().First(y => y.Name == sortField)).ToList();

各 Car オブジェクトの Accessories リストを参照し、Accessories リスト内の Accessories オブジェクトの名前が sortField 値と一致する最初の一致を取得して、車のリストを OrderBy (昇順) しようとしています。

残念ながら、この試行では次のエラーが発生します。

少なくとも 1 つのオブジェクトが IComparable を実装する必要があります

私の問題が十分に明確であることを願っています。事前に感謝します。


user2399170 によって提供されたソリューションに感謝します。私は 3/4 の道のりです:彼らのソリューション/サンプルを取得して、最終結果を昇順/降順に並べようとしています。調整したコードは次のとおりです。

public class Accessory
{
    public string Name { get; set; }
    public string Value { get; set; }
}

public class Car
{
    public string Name { get; set; }
    public IList<Accessory> Accessories { get; set; }
}

private IEnumerable<Car> GetCars()
    {
        var cars = new List<Car>();
        cars.Add(
            new Car()
            {
                Name = "CAR1",
                Accessories = new List<Accessory>()
                {
                    new Accessory() { Name = "ABS Brakes", Value = "1" },
                    new Accessory() { Name = "Airbag", Value = "1" },
                    new Accessory() { Name = "Climate Control", Value = "1" },
                    new Accessory() { Name = "Heated Seats", Value = "1" },
                    new Accessory() { Name = "HID Xenon Headlights", Value = "1" },
                    new Accessory() { Name = "Radio", Value = "1" },
                    new Accessory() { Name = "Quattro", Value = "0" },
                    new Accessory() { Name = "Sat/Nav", Value = "1" },
                    new Accessory() { Name = "Side Assist", Value = "0" },
                    new Accessory() { Name = "Name", Value = "BMW" },
                }
            });
        cars.Add(
            new Car()
            {
                Name = "CAR2",
                Accessories = new List<Accessory>()
                {
                    new Accessory() { Name = "ABS Brakes", Value = "1" },
                    new Accessory() { Name = "Airbag", Value = "1" },
                    new Accessory() { Name = "Climate Control", Value = "1" },
                    new Accessory() { Name = "Heated Seats", Value = "0" },
                    new Accessory() { Name = "HID Xenon Headlights", Value = "0" },
                    new Accessory() { Name = "Radio", Value = "1" },
                    new Accessory() { Name = "Quattro", Value = "0" },
                    new Accessory() { Name = "Sat/Nav", Value = "0" },
                    new Accessory() { Name = "Side Assist", Value = "0" },
                    new Accessory() { Name = "Name", Value = "Mazda" },
                }
            });
        cars.Add(
            new Car()
            {
                Name = "CAR3",
                Accessories = new List<Accessory>()
                {
                    new Accessory() { Name = "ABS Brakes", Value = "1" },
                    new Accessory() { Name = "Airbag", Value = "1" },
                    new Accessory() { Name = "Climate Control", Value = "1" },
                    new Accessory() { Name = "Heated Seats", Value = "1" },
                    new Accessory() { Name = "HID Xenon Headlights", Value = "1" },
                    new Accessory() { Name = "Radio", Value = "1" },
                    new Accessory() { Name = "Quattro", Value = "1" },
                    new Accessory() { Name = "Sat/Nav", Value = "1" },
                    new Accessory() { Name = "Side Assist", Value = "1" },
                    new Accessory() { Name = "Name", Value = "Audi" },

                }
            });

        String[] sortRules = new string[] { "Name" };

        List<Car> sortedCars = sortRules
            .SelectMany(sortRule => cars.Where(car => car.Accessories.Any(acc => acc.Name == sortRule)))
            .Distinct().ToList();

        return sortedCars;
    }

この例では「Audi」、「BMW」、「Mazda」となるソート フィールド「名前」の値で最終結果をソートしたいと思います。

これがどのように機能するかというと、ユーザーはドロップダウンの「名前」から選択でき、結果は「名前」の値でソートできます。残念ながら、これは私が制御できないサードパーティのソースからデータが返される方法です。

4

2 に答える 2

0

このサンプルを試す

private static IEnumerable<Car> GetCars(string filterByAccessory, bool sortAscending = true)
{
    var cars = new List<Car>();
    cars.Add(
        new Car()
        {
            Name = "CAR1",
            Accessories = new List<Accessory>()
        {
            new Accessory() { Name = "ABS Brakes", Value = "1" },
            new Accessory() { Name = "Airbag", Value = "1" },
            new Accessory() { Name = "Climate Control", Value = "1" },
            new Accessory() { Name = "Heated Seats", Value = "1" },
            new Accessory() { Name = "HID Xenon Headlights", Value = "1" },
            new Accessory() { Name = "Radio", Value = "1" },
            new Accessory() { Name = "Quattro", Value = "0" },
            new Accessory() { Name = "Sat/Nav", Value = "1" },
            new Accessory() { Name = "Side Assist", Value = "0" },
            new Accessory() { Name = "Name", Value = "BMW" },
        }
        });
    cars.Add(
        new Car()
        {
            Name = "CAR2",
            Accessories = new List<Accessory>()
        {
            new Accessory() { Name = "ABS Brakes", Value = "1" },
            new Accessory() { Name = "Airbag", Value = "1" },
            new Accessory() { Name = "Climate Control", Value = "1" },
            new Accessory() { Name = "Heated Seats", Value = "0" },
            new Accessory() { Name = "HID Xenon Headlights", Value = "0" },
            new Accessory() { Name = "Radio", Value = "1" },
            new Accessory() { Name = "Quattro", Value = "0" },
            new Accessory() { Name = "Sat/Nav", Value = "0" },
            new Accessory() { Name = "Side Assist", Value = "0" },
            new Accessory() { Name = "Name", Value = "Mazda" },
        }
        });
    cars.Add(
        new Car()
        {
            Name = "CAR3",
            Accessories = new List<Accessory>()
        {
            new Accessory() { Name = "ABS Brakes", Value = "1" },
            new Accessory() { Name = "Airbag", Value = "1" },
            new Accessory() { Name = "Climate Control", Value = "1" },
            new Accessory() { Name = "Heated Seats", Value = "1" },
            new Accessory() { Name = "HID Xenon Headlights", Value = "1" },
            new Accessory() { Name = "Radio", Value = "1" },
            new Accessory() { Name = "Quattro", Value = "1" },
            new Accessory() { Name = "Sat/Nav", Value = "1" },
            new Accessory() { Name = "Side Assist", Value = "1" },
            new Accessory() { Name = "Name", Value = "Audi" },

        }
        });

    var filteredCars = cars.Where(c => c.Accessories.Any(a => a.Name == filterByAccessory));

    var sortedCars = sortAscending
        ? filteredCars.OrderBy(x => x.Accessories.First(a => a.Name == filterByAccessory).Value)
        : filteredCars.OrderByDescending(x => x.Accessories.First(a => a.Name == filterByAccessory).Value);

    return sortedCars;
}
于 2013-05-19T17:26:26.087 に答える
0

並べ替えるには、クラスがインターフェイスAccessoryを実装していることを確認する必要がありますIComparable

public class Accessory : IComparible
{
    public int CompareTo(object obj) {
        //Return 0 for equals
        //Return -1 if this object precedes the given object
        //Return 1 if this object follows the given object
    }
}
于 2013-05-17T22:23:16.173 に答える