2015-03-02 128 views
0

我正在使用类对象(clsDetails)存储播放器详细信息,如下所示。我正在尝试使用LINQ过滤具有相同值的Class对象列表。类对象列表 - 使用LINQ过滤具有相同值的类对象

我想获得所有5次尝试成功的玩家名单。我正在尝试使用LINQ,但它不会返回正确的玩家。

class Program 
    { 
     static void Main(string[] args) 
     { 
      List<clsDetails> lstAllDetails = new List<clsDetails>(); 
      try 
      { 
       clsDetails cd; 

      //Player 1 
      cd = new clsDetails() { iAttemptId =1, sPlayerId="P1",sPlayerSuccess="YES" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 2, sPlayerId = "P1", sPlayerSuccess = "NO" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 3, sPlayerId = "P1", sPlayerSuccess = "NO" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 4, sPlayerId = "P1", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 5, sPlayerId = "P1", sPlayerSuccess = "NO" }; 
      lstAllDetails.Add(cd); 


      //Player 2 
      cd = new clsDetails() { iAttemptId = 1, sPlayerId = "P2", sPlayerSuccess = "NO" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 2, sPlayerId = "P2", sPlayerSuccess = "NO" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 3, sPlayerId = "P2", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 4, sPlayerId = "P2", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 5, sPlayerId = "P2", sPlayerSuccess = "NO" }; 
      lstAllDetails.Add(cd); 

      //Player 3 
      cd = new clsDetails() { iAttemptId = 1, sPlayerId = "P3", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 2, sPlayerId = "P3", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 3, sPlayerId = "P3", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 4, sPlayerId = "P3", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 5, sPlayerId = "P3", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 

      //Player 4 
      cd = new clsDetails() { iAttemptId = 1, sPlayerId = "P4", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 2, sPlayerId = "P4", sPlayerSuccess = "NO" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 3, sPlayerId = "P4", sPlayerSuccess = "NO" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 4, sPlayerId = "P4", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 5, sPlayerId = "P4", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 

      //Player 5 
      cd = new clsDetails() { iAttemptId = 1, sPlayerId = "P5", sPlayerSuccess = "NO" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 2, sPlayerId = "P5", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 3, sPlayerId = "P5", sPlayerSuccess = "NO" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 4, sPlayerId = "P5", sPlayerSuccess = "NO" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 5, sPlayerId = "P5", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 

      //Player 6 
      cd = new clsDetails() { iAttemptId = 1, sPlayerId = "P6", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 2, sPlayerId = "P6", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 3, sPlayerId = "P6", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 4, sPlayerId = "P6", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 
      cd = new clsDetails() { iAttemptId = 5, sPlayerId = "P6", sPlayerSuccess = "YES" }; 
      lstAllDetails.Add(cd); 

      //players successfull in first attempt itself 
      var vSuccessFirstAttempt = (from d in lstAllDetails 
             where d.sPlayerSuccess.ToUpper() == "YES" && d.iAttemptId == 1 
             select d.sPlayerId); 

      //Players successfull in all the 5 attempts 
      var vSuccessAllAttempts = (from d in lstAllDetails 
             group d by new {d.sPlayerId,d.sPlayerSuccess} into grp 
             where grp.Count() ==1 && grp.Key.sPlayerSuccess =="YES" 
             select grp.Key.sPlayerId); 

      // vSuccessAllAttempts - Enumeration yielded No result 

     } 
     catch (Exception ex) 
     { 

     } 
    } 

} 

public class clsDetails 
{ 
    public int iAttemptId = 0; 
    public string sPlayerId = string.Empty; 
    public string sPlayerSuccess = string.Empty; 
} 

我也想

  1. 的球员谁在第一次尝试是成功本身

  2. 球员的名单谁是成功的在第一或第二次尝试列表

  3. 至少3次尝试成功的玩家列表。

  4. 的球员谁在所有的5次尝试

是成功的名单,我不知道什么是与下面的查询,以及为什么它不返回任何值的问题。

var vSuccessAllAttempts = (from d in lstAllDetails 
              group d by new {d.sPlayerId,d.sPlayerSuccess} into grp 
              where grp.Count() ==1 && grp.Key.sPlayerSuccess =="YES" 
              select grp.Key.sPlayerId); 

感谢 阿肖克

回答

2

您需要定义两个方法:

private IEnumerable<string> GetPlayersSuccessfullInAttempt(IEnumerable<clsDetails> players, int attempt) 
{ 
    return players.Where(p=>p.sPlayerSuccess = "YES" && p.iAttemptId == attempt) 
     .Select(p => p.sPlayerId); 
} 

private IEnumerable<string> GetPlayersSuccessfullInAllAttempts(IEnumerable<clsDetails> players, int numberOfAttempts) 
{ 
    return players.GroupBy(p => p.sPlayerId) 
     .Where(g => g.Count(p => p.sPlayerSuccess >= "YES") == numberOfAttempts) 
     .Select(g => g.Key); //g.Key is the player Id 
} 

而现在,到得到结果:

var playersSuccessfullInFirstAttempt = GetPlayersSuccessfullInAttempt(lstAllDetails, 1); 
var playersSuccessfullInFirstOrSecondAttempt = playersSuccessfullInFirstAttempt 
    .Union(GetPlayersSuccessfullInAttempt(lstAllDetails, 2)) 
    .Distinct(); 

var successfullInAtLeast3 = GetPlayersSuccessfullInAllAttempts(lstAllDetails, 3); 
var successfullInAll5 = GetPlayersSuccessfullInAllAttempts(lstAllDetails, 5); 

而且这里的结果在LINQPad

Query results.

1

这应该给你的球员成功的所有尝试:

var vSuccessAllAttempts = (from d in lstAllDetails 
          group d by new {d.sPlayerId,d.sPlayerSuccess} into grp 
          where grp.Count() == 5 && grp.Key.sPlayerSuccess =="YES" 
          select grp.Key.sPlayerId); 
+0

非常感谢,现在工作正常。 – user3219354 2015-03-02 09:56:21

+0

非常感谢,现在工作正常。 – user3219354 2015-03-02 09:56:21

+0

如果它帮助你,请考虑接受这个答案。 – stefankmitph 2015-03-02 10:04:09

1

您可以使用下面的也。

Func<IEnumerable<clsDetails>, int, IEnumerable<String>> successfulInNthAttempt = 
    (p, n) => 
    p.Where(x => x.sPlayerSuccess == "YES" && x.iAttemptId == n) 
     .Select(x => x.sPlayerId); 

Func<IEnumerable<clsDetails>, int, bool, IEnumerable<String>>successfulInAllNAttempts = 
    (p, n, isExact) => 
    p.Where(x => x.sPlayerSuccess == "YES") 
     .GroupBy(y => new {y.sPlayerId, y.sPlayerSuccess}) 
     .Where(z => isExact? z.Count() == n: z.Count()>= n) 
     .Select(x => x.Key.sPlayerId); 

var attempt1 =successfulInNthAttempt(lstAllDetails, 1); 
var attempt1Or2 = successfulInNthAttempt(lstAllDetails, 1).Union(successfulInNthAttempt(lstAllDetails, 2)).Distinct(); 
var atLeast3Attempts = successfulInAllNAttempts(lstAllDetails, 3, false); 
var all5Attempts = successfulInAllNAttempts(lstAllDetails, 5, true); 

相关问题