考虑一下,
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;
提前感谢。
答案 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);
}
}