Linq查询IEnumerable <t>扩展方法</t>

时间:2011-01-01 16:27:50

标签: c# linq

考虑一下,

     class Item
     { 
        public string ID { get; set;}
        public string Description { get; set; }
     }

     class SaleItem
     { 
        public string ID { get; set;}
        public string Discount { get; set; }
     }


     var itemsToRemoved = (List<Item>)ViewState["ItemsToRemove"];
     // get only rows of ID
     var query = from i in itemsToRemoved select i.ID;

     var saleItems= (List<SaleItem>)ViewState["SaleItems"];
     foreach (string s in query.ToArray())
     {
            saleItems.RemoveItem(s);
     }

如何使用IEnumerable / List Extension方法编写此LINQ短语

  // get only rows of ID
   var query = from i in items select i.ID;

提前感谢。

3 个答案:

答案 0 :(得分:5)

那个很容易:

var query = items.Select(i => i.ID);

select子句始终对应于对Select的调用。其他一些运营商最终会得到一个相当复杂的扩展:)如果你努力工作,你可以让编译器做一些very odd stuff ......

您可以在C# specification(v3或v4)的第7.16节中找到此及其他查询表达式翻译的所有详细信息。

<plug> 您还可以购买C# in Depth, 2nd edition并阅读第11章,如果您真的想:)</plug>

答案 1 :(得分:4)

您可以使用:

var query = items.Select(i => i.ID);

其他几点:

此处您无需拨打ToArray

foreach (string s in query.ToArray())

此外,如果您的列表很大并且您要删除大量项目,则可能需要使用List.RemoveAll而不是迭代。每次从列表中删除项目后,必须移动所有其他项目以填补空白。如果您使用RemoveAll,则只需在结束时执行一次,而不是每次删除项目一次。

List<Item> itemsToRemove = (List<Item>)ViewState["ItemsToRemove"];
HashSet<string> itemIds = new HashSet<string>(itemsToRemove.Select(s => s.ID));
saleItems.RemoveAll(c => itemIds.Contains(c.ID));

答案 2 :(得分:3)

public static class ItemCollectionExtensions
{
    public static IEnumerable<int> GetItemIds(this List<Item> list)
    {
        return list.Select(i => i.ID);
    }
}