ValueTuple.Create

时间:2019-03-15 08:52:51

标签: c# .net c#-7.0

我在C#中使用Value Tuple玩耍。

首先提供一些演示数据:

  #region Data
    public class Product
    {
        public string Name { get; set; }
        public int CategoryID { get; set; }
    }

    public class Category
    {
        public string Name { get; set; }
        public int ID { get; set; }
    }

    public class Data
    {
        public List<Category> Categories { get; } = new List<Category>()
        {
            new Category(){Name="Beverages", ID=001},
            new Category(){ Name="Condiments", ID=002},
        };

        public List<Product> Products { get; } = new List<Product>()
        {
            new Product{Name="Cola",  CategoryID=001},
            new Product{Name="Tea",  CategoryID=001},
            new Product{Name="Mustard", CategoryID=002},
            new Product{Name="Pickles", CategoryID=002},
        };

    }
    #endregion

然后使用演示数据的方法:

public static IEnumerable<(int CategoryId, string ProductName)> GetList()
{
    var data = new Data();
    return
        from category in data.Categories
            join prod in data.Products on category.ID equals prod.CategoryID
            select ValueTuple.Create(category.ID, prod.Name);
}

到目前为止没有问题。

但是,如果我想要按产品名称排序的结果,可以执行以下操作:

public static IEnumerable<(int CategoryId, string ProductName)> GetList()
        {
            var data = new Data();
            return
                (from category in data.Categories
                    join prod in data.Products on category.ID equals prod.CategoryID
                    select ValueTuple.Create(category.ID, prod.Name)).OrderBy(e => e.Item2);
        }

这是我的问题:使用ValueTuple.Create(...)时可以命名参数,因此可以在OrderBy中使用这些名称

我希望有这样的东西:

select ValueTuple.Create(CategoryId : category.ID, ProductName : prod.Name)

,然后在我的订单中使用该名称:

OrderBy(e => e.ProductName)

2 个答案:

答案 0 :(得分:6)

您可以在Select中直接创建一个命名元组,并明确指出名称:

(
    from category in data.Categories
    join prod in data.Products on category.ID equals prod.CategoryID
    select (CategoryId: category.Id, ProductName: prod.Name)
).OrderBy(e => e.ProductName);

答案 1 :(得分:1)

也许最好为所有linq查询提供相同的样式。我的意思是在选择之前使用“ orderby”。

public static IEnumerable<(int CategoryId, string ProductName)> GetList()
        {
            var data = new Data();
            return
                from category in data.Categories
                join prod in data.Products on category.ID equals prod.CategoryID
                orderby prod.Name
                select ValueTuple.Create(category.ID, prod.Name);
        }