2013-04-29 56 views
0

我有2个ArrayList,其中包含文件名,现在一个列表有更多的名称和其他可能有更少的名称,或在某些时候相等,我想列出在arraylist和因此更新数据库,我能够检查他们是否平等,但我无法列出哪个列表有额外的元素,他们是哪个。ArrayList中所有不常见元素的列表

这是我目前正在使用的代码。

ArrayList DatabaseSavedThumbnail = objSlideShow.GetAllThumbnailBySlideShowId(); 
     string[] FolderSavedThumbnail = Directory.GetFiles(Server.MapPath("~/Portals/2/SlideShowThumbnails/" + SlideShowName)); 

     if (Directory.GetFiles(Server.MapPath("~/Portals/2/SlideShowThumbnails/" + SlideShowName)).Length > 0) 
     { 
      if (!Object.Equals(DatabaseSavedThumbnail, FolderSavedThumbnail)) 
      { 
       for (int i = 0; i < DatabaseSavedThumbnail.Count && i < FolderSavedThumbnail.Length; i++) 
       { 
        if (!object.Equals(DatabaseSavedThumbnail[i], FolderSavedThumbnail[i])) 
        { 
         if (DatabaseSavedThumbnail.Count > FolderSavedThumbnail.Length) 
         { 
          objSlideShow.Thumbnail = "/Portals/2/SlideShowThumbnails/" + SlideShowName + "/" + Path.GetFileName(DatabaseSavedThumbnail[i].ToString()); 
         } 
         else 
         { 
          objSlideShow.Thumbnail = "/Portals/2/SlideShowThumbnails/" + SlideShowName + "/" + Path.GetFileName(FolderSavedThumbnail[i].ToString()); 
         } 
        } 
        Response.Write(objSlideShow.Thumbnail + "<br>"); 
        /*objSlideShow.SlideTitle = String.Empty; 
        objSlideShow.SlideDescription = string.Empty; 
        objSlideShow.AddSlide();*/ 
       } 
      } 
     } 

但该名单中有多个元素,ArrayList中的所有元素,我只是想差值元素,这样我可以更新仅这些要素数据库。

任何人都可以告诉我如何得到差异记录比较2数组列表。

回答

1

尝试使用此方法得到的元素两个列表中并不常见(假设DatabaseSavedThumbnail具有字符串):

using System.Linq; 
... 
... 
var dstArray = DatabaseSavedThumbnail.ToArray(typeof(string)); 
var fstArray = FolderSavedThumbnail; 

var notCommonElements = dstArray.Union(fstArray).Except(dstArray.InterSect(fstArray)); 

一个非常幼稚的迭代方法可以是:

private IEnumerable<string> GetNotCommonElements(string[] array1, string[] array2) 
{ 
    foreach (var item in array1) 
    { 
     if (!array2.Contains(item)) 
     { 
      yield return item; 
     } 
    } 

    foreach (var item in array2) 
    { 
     if (!array1.Contains(item)) 
     { 
      yield return item; 
     } 
    } 
} 

然后使用它像:

foreach(var item in GetNotCommonElements(dstArray, fstArray)) 
{ 
    // Do stuff with item 
} 
+0

非常感谢,这工作就像一个魅力,但正如我在LINQ位毫不我,你能帮助我与正常的如果你不介意的话,实现这个循环的概念。我无法形成逻辑 – Abbas 2013-04-29 04:25:00

+0

伟大..非常简单和干净的方法,我很感激你。你能告诉我什么是“收益回报项目”吗?呢? – Abbas 2013-04-29 04:39:25

+0

有一个错误。我删除了代码。如果较小的列表有一些独特的项目,这将不起作用。我会在完成我目前的工作后写下代码:p – mshsayem 2013-04-29 04:42:14

0

你可以从这里得到想法

List<int> intersection = first.Cast<int>().Intersect(second.Cast<int>()).ToList(); 

ArrayList intersection = new ArrayList(); 
foreach (var i in first.Cast<int>().Intersect(second.Cast<int>())) 
    intersection.Add(i); 

更多细节
Two ArrayList manipulation