2016-06-05 4 views
-1

У меня есть две коллекции. Первый из них имеет сложный тип, который содержит два строковых свойстваОтличие от одной коллекции от другой коллекции с использованием Linq

chpt_cd и appl_src_cd

public class ChapterCodeValidationOutput 
{ 
    public string chpt_cd { get; set; } 
    public string appl_src_cd { get; set; } 
} 

И это получить хранится в переменной _validChapterCodeLst.

Это образец данных может выглядеть следующим образом:

chpt_cd aapl_src_cd 
------- ----------- 

07038  C062 
06206  C191 

На вход метода, который производит сбор представляет собой набор строк.

List<string> _chapterCodes 

, которые могут содержать данные, такие как:

'070038' 

Я хочу, чтобы найти разницу между два сбором и поместить их в два отдельных списках соответственно.

Какой бы там в _validChapterCodeLst должен быть правильный список Output и он должен иметь две колонки аналогичным образом

chpt_cd и связанный appl_src_cd и инвалиду список должен содержать разницу между _validChapterCodeLst и _chapterCodes список входных данных. А также должно содержать два столбца аналогично.

Я попытался

gmvo._invalidChapterCodes = gmvi._chapterCodes.Except(_validChapterCodeLst.ConvertAll(x => x.chpt_cd.ToString())).ToList(); 

Я попытался преобразовать _validChapterCodeLst в список первой, а затем выполнить исключением.

Но это не сработало.

Также я не знаю, как получить связанное appl_src_cd.

Выход должен быть

06206 C191

ответ

2

Except принимает только коллекции одного и того же типа. Тем не менее, вы можете попробовать это (я использовал HashSet здесь для лучшей производительности):

var _chapterCodesHashSet = new HashSet<string>(_chapterCodes); 
var _invalidChapterCodes = _validChapterCodeLst.Where(item => !_chapterCodesHashSet.Contains(item.chpt_cd)).ToList(); 
+0

Для O (1) поиск HashSet всегда гораздо лучше, чем простой список, O (п), хороший код –

+0

@ stop-cran Ok, но новый HashSet (_validChapterCodeLst) бросает исключение, как вы должны бросать коллекцию сложного типа объекта в коллекцию строки? – StrugglingCoder

+0

@StrugglingCoder, правильно. Отредактированные имена в ответе. –

1

Я где

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

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<ChapterCodeValidationOutput> _validChapterCodeLst = new List<ChapterCodeValidationOutput>() { 
       new ChapterCodeValidationOutput() { chpt_cd = "07038", appl_src_cd = "C062"}, 
       new ChapterCodeValidationOutput() { chpt_cd = "06206", appl_src_cd = "C191"} 
      }; 
      List<string> _chapterCodes = new List<string>() { "07038" }; 
      var results = _validChapterCodeLst.Where(x => !_chapterCodes.Contains(x.chpt_cd)).Select(y => new { chpt_cd = y.chpt_cd, appl_src_cd = y.appl_src_cd}).ToList(); 
     } 
    } 
    public class ChapterCodeValidationOutput 
    { 
     public string chpt_cd { get; set; } 
     public string appl_src_cd { get; set; } 
    } 
}