我有2个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个数组列表的差异记录。
答案 0 :(得分: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
}
答案 1 :(得分: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);