2010-05-14 4 views
0

교체 할 수있는 객체 목록을 찾으려고합니다.linq delegate 함수에서 객체 검사

Class Letter{ 
int ID; 
string Name; 
string AdvCode; 
int isDeleted; 
} 

Class Replacers{ 
int ID; 
string MainAdvCode; 
string ReplacesAdvCode; 
} 

예 데이터 :

대체물

0 455 400

1 955 400

2 955 455

LettersA 
0 pack 455 
1 addon 400 

LettersB 
0 big 955 
1 pack 455 

LettersC 
0 addon 400 
1 big 955 
2 pack 455 

LettersD 
0 pack 455 
1 none 019 

solution: 
LetterA 1 isDeleted 
LeterB 1 isDeleted 
LetterC 0 and 2 isDeleted 
LetterD --- 

되도록 문자가있는 경우 및 Advc 455의 ode와 400의 400의 코드를 가지고있는 다른 것은 400를 삭제 표시했다. 그리고 나서 다른 편지에 955가 있으면 455는 삭제로 표시되고 400 (이미 표시되어 있음)은 삭제로 표시됩니다.

문제는 현재 코드에서 400과 455 자체가 삭제 표시입니까?!?!?

Public class Main{ 
List<Letter> Letters; 
List<Replacers> replaces; 

    //select the ones to replace the replacements aka the little guys 

    //check if the replacements replacer exists if yes mark deleted 

    var filterMethodReplacements = new Func<Letter, bool>(IsAdvInReplacements);//Working 

    var filterMethodReplacers = new Func<Letter, bool>(IsAdvInReplacers);//NOT WORKING???? 

    var resReplacements=letters.Where(filterMethodReplacements);//working 

    foreach (Letter letter in resReplacements) 
    { 
     //select the Replacers aka the ones that contain the little guys 

     var resReplacers = letters.Where(filterMethodReplacers); 

     if (resReplacers != null) 

      letter.isDeleted = 1; 
    } 

     private bool IsAdvInReplacements(Letter letter) 
     { 
      return (from a in Replacables where a.ReplaceAdvCode == letter.AdvCode select a).Any(); 
     } 
     private bool IsAdvInReplacers(Letter letter) 
     { 
      //?????????????????????????????? 
      return (from a in Replacables where a.MainAdvCode == letter.AdvCode select a).Any(); 
     } 
} 
+0

당신은 정말 단순한 무언가 간단합니다 .... 왜 Func <>을 모두하고 있습니까? 그리고 뭐야? – Nix

+0

이 문제를 해결할 수있는 가장 간단한 방법입니다. \t 난 그냥 가장 간단한 방법으로 문제를 해결하려면 가능한 모든 도움을 주시면 감사하겠습니다. 감사. – Philip

+0

나는 "편지가 있고 455의 Advcode와 400의 부호가있는 경우에"편지의 몇몇보기 자료 세트를 준다 그런 선을 "이해하지 않는다. – Nix

답변

1

아래를 참조하십시오. 해결책은 이름으로 그룹화 한 다음 대체자를 반복하는 것입니다.

public class Letter 
    { 
     public int ID; 
     public string Name; 
     public string AdvCode; 
     public string Type; 
     public Boolean isDeleted; 

     public override string ToString() 
     { 
      return this.Name + "[" + this.ID + "]" + ":" + this.Type + " AdvCode=" + AdvCode + " Deleted: " + this.isDeleted.ToString(); 
     } 
    } 

    public class Replacers 
    { 
     public int ID; 
     public string MainAdvCode; 
     public string ReplacesAdvCode; 
    } 

class Program 
{ 

static void Main(string[] args) 
    { 
     List<Letter> letters = GetLetters(); 
     List<Replacers> replacables = GetReplacers(); 



     foreach (IGrouping<string, Letter> g in letters.GroupBy(x => x.Name)) 
     { 
      List<Letter> byName = g.ToList(); 


      foreach (Replacers r in replacables) 
      { 
       if (byName.Any(x => x.AdvCode == r.MainAdvCode) && byName.Any(x=>x.AdvCode==r.ReplacesAdvCode)) 
       { 
        //If we contain the code to replace... 
        foreach (Letter letter in byName.Where(x=>x.AdvCode==r.ReplacesAdvCode)){ 
         letter.isDeleted = true; 
        } 
       } 
      } 
     } 

     Console.WriteLine("Result"); 
     foreach (Letter l in letters.Where(x=>x.isDeleted)) 
     { 
      Console.WriteLine(l.ToString()); 
     } 
     Console.WriteLine("Press key to close"); 
     Console.ReadKey(); 

    } 

    public static List<Letter> GetLetters() 
    { 
     List<Letter> letters = new List<Letter>(){ 
      new Letter(){ 
       Name = "LettersA", 
       ID = 0, 
       AdvCode="455", 
       Type="pack", 
       isDeleted = false 
      }, 
      new Letter(){ 
       Name = "LettersA", 
       Type="addon", 
       ID = 1, 
       AdvCode="400", 
       isDeleted = false 
      }, 
       new Letter(){ 
       Name = "LettersB", 
       ID = 0, 
       AdvCode="955", 
       Type="big", 
       isDeleted = false 
      }, 
      new Letter(){ 
       Name = "LettersB", 
       Type="pack", 
       ID = 1, 
       AdvCode="455", 
       isDeleted = false 
      }, 
       new Letter(){ 
       Name = "LettersC", 
       ID = 0, 
       AdvCode="400", 
       Type="addon", 
       isDeleted = false 
      }, 
      new Letter(){ 
       Name = "LettersC", 
       Type="big", 
       ID = 1, 
       AdvCode="955", 
       isDeleted = false 
      }, 
      new Letter(){ 
       Name = "LettersC", 
       Type="pack", 
       ID = 2, 
       AdvCode="455", 
       isDeleted = false 
      }, 
       new Letter(){ 
       Name = "LettersD", 
       ID = 0, 
       AdvCode="455", 
       Type="pack", 
       isDeleted = false 
      }, 
      new Letter(){ 
       Name = "LettersD", 
       Type="none", 
       ID = 1, 
       AdvCode="019", 
       isDeleted = false 
      }, 
     }; 

     return letters; 

    } 

    public static List<Replacers> GetReplacers() 
    { 
     return new List<Replacers>(){ 
      new Replacers(){ 
       ID = 0, 
       MainAdvCode = "455", 
       ReplacesAdvCode = "400" 
      }, 
      new Replacers(){ 
       ID = 1, 
       MainAdvCode = "955", 
       ReplacesAdvCode = "400" 
      }, 
      new Replacers(){ 
       ID = 2, 
       MainAdvCode = "955", 
       ReplacesAdvCode = "455" 
      }, 
     }; 
    } 
+0

정말 고마워요! – Philip

+0

수락을 보내 주셔서 감사합니다;) – Nix