0

我必须按一个值对给定列表进行排序,该值可能会或可能不会在每个元素的另一个列表中给出。如果没有给出值,这个元素应该出现在排序列表的底部。

这是一个简短的示例:我想Items根据名称Value对列表进行排序Propertyfoo

public class Item {
    public string Name { get; set; }
    public List<Property> Properties { get; set; }
}

public class Property {
    public string Name { get; set; }
    public int Value { get; set; }
}

List<Item> items = new List<Item>() {
    new Item() {
        Name = "Item 1",
        Properties = new List<Property>() {
            new Property {
                Name = "foo",
                Value = 5
            },
            new Property {
                Name = "bar",
                Value = 7
            }
        }
    },
    new Item() {
        Name = "Item 2",
        Properties = new List<Property>() {
            new Property {
                Name = "bar",
                Value = 2
            }
        }
    },
    new Item() {
        Name = "Item 3",
        Properties = new List<Property>() {
            new Property {
                Name = "foo",
                Value = 1
            }
        }
    }

排序后的列表应包含Items 的顺序Item 1, Item 3,Item 2

我试过这个:

items.FetchOrderBy
(
    x => x.Properties
    .FirstOrDefault
    (
        y => y.Name = "foo"
    )
    .Value
)
.ToList();

...但有以下异常:Antlr.Runtime.NoViableAltException

4

1 回答 1

1

问题是当没有属性匹配时,FirstOrDefault返回 null。您可以通过使用空合并运算符来解决此问题:

items.FetchOrderBy
(
    x => (x.Properties
    .FirstOrDefault
    (
        y => y.Name == "foo"
    )
    // Send non-matches to the bottom
    ?? new Property { Value = Int32.MaxValue })
    .Value
)
.ToList();
于 2013-08-15T23:02:50.757 回答