c# - 两个列表同步

标签 c# linq list generic-list ilist

我正在做两个列表之间的同步。 IList<Event> GoogleEventsTable<myEvent> DB.Events;

在谷歌方面,我正在使用 this

String Summary,
String Description,
EventDateTime Start,
EventDateTime End,
Event.RemindersData Reminders;

像这样在数据库端

Db event

我的代码是这样的

foreach (myEvent item in DB.Events)
{
    if (item.GoogleID == "" || item.GoogleID == null)// i add event my db
    {
        //Add dbEvent to google and save id to googleid column
    }
}

foreach (Event item in myGoogleCalendar.Items)
{
    if (DB.Events.Where(o => o.GoogleID == item.Id).Count() == 0)// i add event google
    {
        //Add googleEvent to dbEvent
    }
    else
    {
        //This event also existing in two server
        myEvent dbEvent = DB.Olaylar.Where(o => o.GoogleID == item.Id).First();
        if(item.Updated.Value == dbEvent.UpdateTime) continue;//Same

        if (item.Updated.Value > dbEvent.UpdateTime)
        {
            //Google event is new 
        }
        else
        {
            //dbEvent is new 
        }

    }

}

有个大问题:我忘了删除

我应该在哪里添加删除事件部分以及如何添加?

最佳答案

问题不在于实现删除同步,而在于识别事件是否已在一个列表中删除或添加到另一个列表。

我建议不要从 DB.Events 列表中删除事件,而是将它们标记为已删除。

因此,你需要一个标志

bool IsDeleted = false;

在您的类型 myEvent 中。

在谷歌列表中(我假设你使用 https://developers.google.com/google-apps/calendar/v3/reference/events )你没有这样的标志。所以你的算法需要有点棘手。

所以需要先从Google列表同步

foreach (Event item in myGoogleCalendar.Items)
{
    if (DB.Events.Where(o => o.GoogleID == item.Id).Count() == 0)
    {
        // create new DB event from Google event, because since it is 
        // not in the DB.Events list, it has not been deleted there earlier, 
        // else there would be an event with IsDeleted=true
    }
    else
    {
        //This event exists in both
        myEvent dbEvent = DB.Events.Where(o => o.GoogleID == item.Id).First();
        if (dbEvent.IsDeleted)
        {
           // delete Google event, since the flag in DB.Events list shows that 
           // it existed earlier and has been deleted in DB.Events list.
        }
        else
        {
            if(item.Updated.Value == dbEvent.UpdateTime) continue;//Same

            if (item.Updated.Value > dbEvent.UpdateTime)
            {
                // update DB event
            }
            else
            {
                // update Google event
            }
        }
    }
}

然后从您的 DB.Events 列表同步

foreach (myEvent item in DB.Events)
{
    if (!item.IsDeleted && string.IsNullOrEmpty(item.GoogleID))
    {
        // Create new Google Event from DB event
    }
    else if (!item.IsDeleted && !string.IsNullOrEmpty(item.GoogleID))
    {
        // Mark DB event as deleted
        item.IsDeleted = true;
    }
}

这在场景中有效

  • 您在数据库中创建一个事件
  • 您在 Google 中创建了一个事件
  • 您在数据库中删除了一个事件
  • 您在 Google 中删除了一个事件

关于c# - 两个列表同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24671814/

相关文章:

c# - 如何反序列化 WCF 中的自定义 SOAP header ?

c# - ASP :radiobuttonlist css style

c# - 如何在 C# 中使用 Bogus 库生成字符串列表?

LINQ to Entities 无法识别方法 'System.String Format(System.String, System.Object, System.Object)'

c# - 重置在组框中以编程方式创建的标签的值

c# - 用于过滤实体集合列表并维护实体列表的 Linq 表达式

c# - linq中的switch case

mysql - MySQL GROUP BY 语句中 List 聚合函数的替代方法

java - 按对象属性计算两个列表的交集

python - 从生成器克隆 Babeltrace 事件以进行随机访问遍历