2013-12-20 2 views
1

У меня есть два объекта, один AnotherList, который содержит массив целых чисел, а другой MyFolder, который содержит массив объектов FolderItem, который содержит массив объектов ItemKeyword, которые имеют две строки (в ключе -value-pair style).Невозможно выполнить не в

Я хочу вернуть List<FolderItem> из MyFolder, что не, на которые ссылается в AnotherList. Я могу получить список предметов, которые являются в списке и включили Linq для этого в нижней части.

Я боролся с. Contains и .Except расширений всего дня, но продолжайте получать ошибки. Я надеюсь, что это легко для кого-то.

Это код, где код говорит тысячу слов, так что вот оно.

Запрос Linq в конце возвращает только один FolderItem на данный момент folderItemID=25.

Мне нужно, чтобы оно было возвращено FolderItemsfolderItemID=26,27,28.

using System; 
using System.Collections.Generic; 
using System.Text.RegularExpressions; 
using System.Linq; 

namespace temp 
{ 
    class MyFolder 
    { 
     public FolderItem[] items { get; set; } 
    } 

    class FolderItem 
    { 
     public int folderItemID { get; set; } 
     public ItemKeyword[] keywords { get; set; } 
    } 

    class ItemKeyword 
    { 
     public string key { get; set; } 
     public string value { get; set; } 
    } 

    class AnotherList 
    { 
     public AnotherListItem[] items { get; set; } 
    } 

    class AnotherListItem 
    { 
     public int dataID { get; set; } 
    } 




    public class TestingClass 
    { 

     public static void mainApp() 
     { 
      AnotherList List1 = new AnotherList() 
       { 
        items = new AnotherListItem[]{ 
         new AnotherListItem(){dataID=1}, 
         new AnotherListItem(){dataID=2}, 
         new AnotherListItem(){dataID=3} 
        }}; 

      MyFolder List2 = new MyFolder() 
      { 
       items = new FolderItem[] 
       { 
        new FolderItem() 
         { 
          folderItemID=25, keywords= new ItemKeyword[] 
           { 
            new ItemKeyword(){key="dataID", value="1"}, 
            new ItemKeyword(){key="description", value="some text"}, 
           } 
        }, 
        new FolderItem() 
         { 
          folderItemID=26, keywords= new ItemKeyword[] 
           { 
            new ItemKeyword(){key="dataID", value="4"}, 
            new ItemKeyword(){key="description", value="some other text"}, 
           } 
         }, 
        new FolderItem() 
         { 
          folderItemID=27, keywords= new ItemKeyword[] 
           { 
            new ItemKeyword(){key="dataID", value="9"}, 
            new ItemKeyword(){key="description", value="even more other text"}, 
           } 
         }, 
        new FolderItem() 
         { 
          folderItemID=28, keywords= new ItemKeyword[] 
           { 
            new ItemKeyword(){key="dataID", value="12"}, 
            new ItemKeyword(){key="description", value="3"}, 
           } 
         } 
       }}; 

      List<FolderItem> res = (from someItems in List2.items 
            from itemKeywords in someItems.keywords 
            join otherItems in List1.items on itemKeywords.value equals otherItems.dataID.ToString() 
            where itemKeywords.key == "dataID" 
            select someItems).ToList<FolderItem>(); 

     } 
    } 

} 
+2

* «но я все время получаю ошибки» *. Вы действительно должны поделиться с нами, ** какие ** ошибки вы получите. – abelenky

ответ

1

Попробуйте использовать метод расширения Any. Вы можете с уверенностью скопировать и вставить код ниже, так как он предназначен для работы с кодом, который вы предоставили ...

 List<FolderItem> res = List2.items.Where(x => !List1.items.Any(y => x.keywords.FirstOrDefault(z => z.key == "dataID").value == y.dataID.ToString())).ToList(); 
+0

Все ответы действительно ответили на мой вопрос, но это было проще всего. Еще один вопрос, хотя ... как я могу справиться с тем фактом, что в «FolderItem» отсутствует ключ «dataID»? –

+0

Ну, я думаю, это зависит от того, как вы хотите, чтобы ваше приложение справлялось с этой ситуацией. Что должно произойти, если 'FolderItem' не имеет этого ключа? – Leo

+0

Извините, да ... Я бы не хотел, чтобы он появлялся в вашем результирующем списке

2

Первый захват всех идентификаторов, которые мы не хотим, и наклеить их в набор для быстрого поиска:

var badIDs = new HashSet<int>(List1.items.Select(item => item.dataID)); 

Затем получить все папки, где они не содержатся в этом наборе :

var goodFolders = List2.items.Where(folder => 
    !badIDs.Contains(folder.folderItemID)); 
1
var res = List2.items.Where(fi => !List1.items.Any(al => 
    al.dataID.ToString() == fi.keywords.Single(k => k.key == "dataID").value)); 

Предполагая FolderItem имеет только один ItemKeyword с key="dataID".

+0

Это такой же хороший ответ, как и у Лео. –

Смежные вопросы