【问题标题】:List select range of objects based on property value根据属性值列出选择范围的对象
【发布时间】:2015-12-29 12:13:10
【问题描述】:

我有以下列表:

List<MyType> myList = new List<MyType>
{
    new MyType {Key = "aa", Value = "test1"},
    new MyType {Key = "bb", Value = "test2"},
    new MyType {Key = "zz", Value = "testzz"},
    new MyType {Key = "cc", Value = "test3"},
    new MyType {Key = "yy", Value = "testyy"},
    new MyType {Key = "dd", Value = "test4"},
    new MyType {Key = "ee", Value = "test5"}
};

在哪里,

public class MyType
{
    public string Key { get; set; }
    public string Value { get; set; }
}

现在,我想根据 Key 的值检索范围内的所有对象。也就是说,我想从列表中选择从 Key="bb" 到 Key="dd" (无字母顺序)的所有对象,这样我就会得到以下结果:

new MyType {Key = "bb", Value = "test2"},
new MyType {Key = "zz", Value = "testzz"},
new MyType {Key = "cc", Value = "test3"},
new MyType {Key = "yy", Value = "testyy"},
new MyType {Key = "dd", Value = "test4"}

如何使用 linq/lambda 表达式实现这一点?

[更新:2015 年 12 月 30 日]:键未按字母顺序排列,可能有数百个键。因此,涉及 list.Contains(..) 并假设字母顺序的解决方案将不起作用。我还更新了示例以包含具有键 'yy' 和 'zz' 的对象以反映相同。

【问题讨论】:

  • 您的标准实际上可以有多多样化?它们总是在一个范围内还是完全不相交?根据这一点,可能会有大不相同的答案。

标签: c# linq list lambda


【解决方案1】:

如果您有一组不相交的键,那么您可以使用Contains 运算符:

var keys = new [] { "bb", "cc", "dd" };

var result = myList.Where(x => keys.Contains(x.Key));

【讨论】:

    【解决方案2】:

    我假设您说的是两个特定项目之间的项目(按位置,而不是基于字母顺序)。

    你可以这样做:

    bool found_last = false;
    
    var first = "bb";
    var last = "dd";
    
    var result = myList.SkipWhile(x => x.Key != first).TakeWhile(x =>
    {
        if (x.Key == last)
        {
            found_last = true;
            return true;
        }
    
        return !found_last;
    
    }).ToList();
    

    【讨论】:

    • 每个其他答案都试图从List&lt;&gt; 中查找条目,无论它们在列表中的哪个位置,这样每个条目的键都在两个“极端”值之间("bb""dd") 以某种字母顺序。您的答案对问题的解释不同。您使用"bb""dd" 来标识List&lt;&gt; 中的开始和结束位置,然后将列表中的每个条目包括在开始和结束点(包括两者)之间。你的解释不等于其他人的解释。如果提问者能验证他的意思就好了。
    【解决方案3】:

    试试这个:-

    var kys = new[] { "bb", "cc", "dd" };
    var Result = myList.Where(x => kys.Contains(x.Key));
    

    【讨论】:

      【解决方案4】:

      您可以简单地使用Where

      string start = "bb";
      string end   = "dd";
      
      var rows = myList.Where(x => x.CompareTo(start) >= 0 && x.CompareTo(end) <= 0);
      

      【讨论】:

      • 仅当键是连续的并且具有排序顺序时。
      • 确实如此。对于复杂的场景,您必须制定自己的比较方法。
      • 运算符'>='不能应用于'string'和'string'类型的操作数你知道的。
      • 是的,嗯。 CompareTo 在这里更好。
      猜你喜欢
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多