2010-03-17 49 views
3

我试图找到如下的解决方案(我使用LINQ思考)以下:2个数组的内部连接?

我需要从文件较大列表下拉具有相似的FTP服务器上的特定文件文件名。例如,我们发送订单文件给某公司进行处理,然后他们返回一个我们可以下载的响应文件。

所以,我可以给他们发送文件“order_123.txt”和“order_456.txt”。经过一段时间后,我需要去查找并下载那些名为“order_123.resp”和“order_456.resp”的文件的响应。在某些情况下,我可以有多个响应,在这种情况下,他们会创建“order_123-1.resp”和“order_123-2.resp”,并且这些文件不会从服务器中删除。

我知道这可以通过循环遍历文件来实现我知道我需要响应然后遍历服务器上的所有文件,直到找到匹配的文件,但我希望我不必循环服务器上的文件不止一次。

这个例子可能有助于澄清:

我送他们处理他们和FTP服务器包含 “order_222.txt” 和 “order_333.txt”: “order_111-1.resp” “order_001。响应” “order_222-1.resp” “order_222-2.resp” “order_333.resp”

我需要下载第3,第4,第5和文件。

谢谢。

回答

0

下面是做这件事:

string[] requests = { "order_222.txt", "order_333.txt" }; 
string[] responses = { 
         "order_111-1.resp", 
         "order_001.resp", 
         "order_222-1.resp", 
         "order_222-2.resp", 
         "order_333.resp" 
        }; 

Regex regex = new Regex(@"(-\d+)?\.resp$"); 
IEnumerable<string> toDownload = 
    responses.Where(x => requests.Contains(regex.Replace(x, ".txt"))); 
foreach (string filename in toDownload) 
    Console.WriteLine(filename); 

输出:

order_222-1.resp 
order_222-2.resp 
order_333.resp 

它每次使用线性查找请求阵列英寸这可以通过使用散列查找(Dictionary,HashSet等)来改进。

+0

如果你的答复[]包含字符串[]响应= { “order_111_1.resp”, “order_111_1.txt”, “order_001.resp”, “order_222_1。 resp“, ”order_222.txt“, ”order_222_2.resp“, ”order_333.resp“, ”order_333.txt“ }; 你只想要他们各自的.resp文件(并注意“_”而不是“ - ”) – scarpacci 2010-03-17 22:10:17

0

试试这个

string[] requests = { 
      "order_222.txt", 
      "order_333.txt" }; 
string[] responses = { 
      "order_222.txt", 
      "order_333.txt", 
      "order_111-1.resp", 
      "order_001.resp", 
      "order_222-1.resp", 
      "order_222-2.resp", 
      "order_333.resp" 
      }; 

var r = from req in requests 
     from res in responses 
     where res.StartsWith(Path.GetFileNameWithoutExtension(req)) 
       && Path.GetExtension(res) == ".resp" 
     select res;