2016-03-18 36 views
0

我收到的文件列表,以及文件夹,他们居住在文件夹/文件名列表(字符串) - 只取第一个文件夹中的文件 - 可以通过Linq?

我只能处理1个,在任何阶段,每个文件夹的文件 - 并且需要返回每个文件夹中的 第一个文件(这些第一文件进行处理后,他们将从列表因此被移除)

,如果我有输入:

/Foldername1/OrderNo1.csv 
/Foldername2/OrderNo2.csv 
/Foldername1/OrderNo3.csv 
/Foldername3/OrderNo4.csv 
/Foldername2/OrderNo5.csv 

它应该返回

/FolderName1/OrderNo1.csv 
/FolderName2/OrderNo2.csv 
/FolderName3/OrderNo4.csv 



public void Main() 
{ 
RunThis(); 
} 
public class Order 
{ 
    public string OrderNo; 
    public int CustomerID; 
} 
private void RunThis() 
{ 
    List<Order> o = new List<Order>() 
    { 
     new Order { OrderNo = "/Foldername1/OrderNo1.csv",CustomerID = 1}, 
     new Order { OrderNo = "/Foldername2/OrderNo2.csv",CustomerID = 7}, 
     new Order { OrderNo = "/Foldername1/OrderNo3.csv",CustomerID = 8}, 
     new Order { OrderNo = "/Foldername3/OrderNo4.csv",CustomerID = 12}, 
     new Order { OrderNo = "/Foldername2/OrderNo5.csv",CustomerID = 8}, 
    }; 


    Console.WriteLine(o);       

} 

经由LINQ的这是可能的,或者仅是有可能通过创建 2个阵列 1.以保持经处理的文件夹 2的列表通过directory name并保持的第一文件的列表中的文件夹

Loop each filename 
    if processed folder does not contain files Directory Name 
    add foldername to processedfolders 
    add file to list of first files 
    end if 
next 

回答

2

组拿第一个文件从每个组:

List<Order> list = new List<Order>() 
{ 
    new Order { OrderNo = "/Foldername1/OrderNo1.csv",CustomerID = 1}, 
    new Order { OrderNo = "/Foldername2/OrderNo2.csv",CustomerID = 7}, 
    new Order { OrderNo = "/Foldername1/OrderNo3.csv",CustomerID = 8}, 
    new Order { OrderNo = "/Foldername3/OrderNo4.csv",CustomerID = 12}, 
    new Order { OrderNo = "/Foldername2/OrderNo5.csv",CustomerID = 8}, 
}; 

var files = list.GroupBy(o=>Path.GetDirectoryName(o.OrderNo)).Select(o=>o.First()); 
+0

辉煌,谢谢大家的帮助 –

1

在LINQ的方式来处理,这是对组记录,如果需要的组进行排序,然后使用First方法从每个组返回单个项目。

在您的具体情况下,分组术语将是文件夹名称,您可以使用Path.GetDirectoryName方法提取文件夹名称。可以排序之前的分组操作来完成的,应当保持所要求的顺序:

var query = 
    from ord in list 
    orderby ord.OrderNo 
    group ord.OrderNo by Path.GetDirectoryName(ord.OrderNo) into grp 
    select grp.First(); 

从这个结果记录:

/Foldername1/OrderNo1.csv 
/Foldername2/OrderNo2.csv 
/Foldername3/OrderNo4.csv 
相关问题