2016-02-28 47 views
0

顶部多个匹配的项目我都可以包含的人多条记录清单:移动那里有一个列表

result =people.Select(p => new PersonDetail 
      { 
       Involvement = p._Discriminator, 
       FullName = p.BuildFullName(), 
       DateOfBirth = p.DateOfBirth != null ? p.DateOfBirth.Value.ToShortDateString() : string.Empty, 
       Race = MappingExtensions.MergeCodeAndText(p.RaceCode, p.RaceText), 
       Sex = MappingExtensions.MergeCodeAndText(p.SexCode, p.SexText), 
       Height = p.Height, 
       Weight = p.Weight != null ? p.Weight.ToString() : string.Empty, 
       EyeColor = MappingExtensions.MergeCodeAndText(p.EyeColorCode, p.EyeColorText), 
       HairColor = MappingExtensions.MergeCodeAndText(p.HairColor1Code, p.HairColor1Text), 
       //... 
      }).ToList(); 

我要订购通过参与式这个列表(被害人,犯罪嫌疑人,见证)。

我已经试过以下使用RemoveInsert

foreach (var i in result.Where(i => i.Involvement.ToLower() =="suspect")) 
      { 
       result.Remove(i); 
       result.Insert(0, i); 
      } 
      return result; 

在它作为我期待但在第二圈我得到抛出的异常的第一个循环。我怀疑有一些递归正在进行或抛出异常,因为它不断找到我在第一次传递中提升的记录,并且无法获取它。

我想执行一个循环而不仅仅是一个循环,因为可能有多个记录被标记为可疑。我需要将所有这些推广到证人或受害者之上。其他涉及订购无关。

例如:

Bob "suspect" 
Jane"suspect" 
Kenny "witness" 
Joe "victim" 

如何选择多条记录,并确保它们被放置在上面他人列表的顶部有什么建议?

感谢您的任何意见或建议

+0

你可以使用linq的OrderBy方法。这里有一个答案,它显示了如何按自定义逻辑进行排序:http://stackoverflow.com/questions/3007470/custom-sort-logic-in-orderby-using-linq –

+0

@AbdullahNehir将colleciton类型更改为IOrderedEnumerable并更新代码返回result.OrderBy(i => i.Involvement.ToLower()==“suspect”);不会更改列表中项目的排序。 – rlcrews

+0

将结果的顺序设置为结果列表。刚刚出现的答案显示了我的意思。 –

回答

1

首先在所有的foreach你不能改变结果集。中的foreach所使用的收集是不可改变的,这里是解释MSDN链接:foreach

您可以使用排序依据到您的收藏重新排序:在排序依据

result = result.OrderBy(r => r.Involvement.ToLower() =="suspect" ? 0 : 1).ToList(); 

表达会促进“可疑”物品的顶部结果。

1

如果只是被命令列表关心的Suspect在名单顶部的优先级,即

Kenny, Witness 
Bob, Suspect 
Joe, Victim 
Jane, Suspect 

换句话说,如果排序的优先级还包括目前公认的答案才会成功WitnessVictim,所接受的答案将是正确的,因为Witness已经优先于Victim的命令;使用接受的答案时,结果将是正确的:

Bob, Suspect 
Jane, Suspect 
Kenny, Witness 
Joe, Victim 

但是,如果排序的优先级必须包括不是“怀疑”等字符串,然后接受的答案会失败,即如果列表来作为,

Jill, Victim 
Kenny, Witness 
Bob, Suspect 
Joe, Victim 
Jane, Suspect 

那么结果将是:

Bob, Suspect 
Jane, Suspect 
Jill, Victim 
Kenny, Witness 
Joe, Victim 

但是,正确的结果应该是(假设见证优先于受害人):

Bob, Suspect 
Jane, Suspect 
Kenny, Witness 
Jill, Victim 
Joe, Victim 

要基于非alpha排序进行自定义排序,您需要提供一些类型的​​或类似的:

// Sample class with a name and involvement: 
public class Detail 
{ 
    public string Name { get; set; } 
    public string Involvement { get; set; } 

    public Detail(string name, string involvement) 
    { 
     Name = name; 
     Involvement = involvement; 
    } 
} 

// implementation of IComparer that uses a custom alpha sort: 
public class DetailComparer : IComparer<Detail> 
{ 
    static readonly List<string> Ordered = new List<string> { "suspect", "witness", "victim" }; 
    public int Compare(Detail x, Detail y) 
    { 
     int i = Ordered.FindIndex(str => str.Equals(x.Involvement, StringComparison.OrdinalIgnoreCase)); 
     int j = Ordered.FindIndex(str => str.Equals(y.Involvement, StringComparison.OrdinalIgnoreCase)); 

     if(i > j) return 1; 
     if(i < j) return -1; 
     return 0; 
    } 
} 

列表然后可以提供比较器进行排序:

var details = new List<Detail> 
{ 
    new Detail("Jill", "Victim"), 
    new Detail("Kenny", "Witness"), 
    new Detail("Bob", "Suspect"), 
    new Detail("Joe", "Victim"), 
    new Detail("Jane", "Suspect"), 
}; 

details.Sort(new DetailComparer()); 

通过提供自定义的IComparer,任何优先级可以申报为每一个“参与”。

+0

感谢您的信息。目前的实施不需要分类额外的涉入。他们只关心嫌疑犯。这是一个很好的选择,但很有参考价值。 – rlcrews