linq委托函数检查对象

问题描述:

我想找到可以替换的对象列表。linq委托函数检查对象

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

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

示例数据:

代用品

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的颂歌,另一个400的代码被标记为删除。然后如果另一个Letter有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

你真的太过复杂一些简单的....你为什么做所有的函数功能吗?和anys? – Nix 2010-05-14 17:31:35

+0

这是我能想到解决这个问题最简单的方法。 \t 我只是想以最简单的方式解决问题,非常感谢您的帮助。谢谢。 – Philip 2010-05-14 17:52:07

+0

我不理解这行,“如果一封信有455码,而另一个有400码”,则给出一些示例数据集。 – Nix 2010-05-14 17:53:13

请参阅下面的解决方案,按名称进行分组,然后迭代替换器。

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 2010-05-17 19:33:02

+0

你可以用接受来感谢我;) – Nix 2010-05-17 19:55:26