从字符串集合中使用like运算符过滤集合

时间:2014-03-10 12:50:11

标签: c# linq collections

我有一个字符串集合:

["1-","2-","4-"]

我也有一系列课程。

类别:

public class ProductionParameter
    {
        public string CompanyCode { get; set; }
        public string UnitCode { get; set; }
        public string ItemDescriptionLocal { get; set; }
        public string ItemDescriptionEnglish { get; set; }
        public string ConsumedItemDescriptionLocal { get; set; }
        public string ConsumedItemDescriptionEnglish { get; set; }
        public string LotCategory1Description { get; set; }
        public string LotCategory2Description { get; set; }
        public string LotCategory3Description { get; set; }
        public string LotCategory1Code { get; set; }
        public string LotCategory2Code { get; set; }
        public string LotCategory3Code { get; set; }
        public string LineCode { get; set; }
        public string LineCodeDisplay { get; set; }
        public string ItemUOM1 { get; set; }
        public string ItemUOM2 { get; set; }
        public string ConsumedItemUOM1 { get; set; }
        public string ConsumedItemUOM2 { get; set; }
        public string WorkShift { get; set; }
    }

我想获取集合中的所有成员,其中LineCode属性在字符串集合中,但具有类似的操作。

示例:我想检查productionparmaters列表中的每个类,并仅保留LineCode属性所在的实例:

(LIKE '1-%' OR like '2-%' OR LIKE '4-%')

2 个答案:

答案 0 :(得分:2)

您可以使用LINQ来执行此操作: 假设stringCollection是您帖子中的字符串集合,而lstProductionParameter是您引用的对象列表集合。

编辑完问题后,我会给出两个可能的答案:

1)如果你需要检查字符串中的值或LineCode是否有任何值,你可以这样:

var lstProductionParameterFiltered = lstProductionParameter.Where(c => stringCollection.Any(s => c.Linecode.Contains(s)));

如果您使用StringCollection类区域(我更喜欢使用List或Array来执行此btw),您可以像这样强制转换StringCollection:

var lstProductionParameterFiltered = lstProductionParameter.Where(c => ((IEnumerable<string>)stringCollection).Any(s => c.Linecode.Contains(s)));

2)如果你需要检查是否有任何stringCollection有LineCode,你可以采取另一种方式:

var lstProductionParameterFiltered = lstProductionParameter.Where(c => stringCollection.Contains(c.Linecode));

答案 1 :(得分:0)

您可以在Contains中使用Where。这将比较整个字符串:

var filteredParameters = productionParameters
    .Where(pp => strings.Contains(pp.LineCode));

如果您想检查它是否以它开头,您可以使用Any + string.StartsWith

var filteredParameters = productionParameters
    .Where(pp => strings.Any(s => (pp.LineCode ?? "").StartsWith(s)));

注意这个&gt; ??null-coalescing operator我用来处理此属性可以null的情况。然而,它会提出NullReferenceException

如果它不是List<string>(正如我所假设的)而是来自配置文件的StringCollection,则必须使用Enumerable.Cast来支持LINQ:

var strings = stringCollection.Cast<string>();
var filteredParameters = productionParameters
    .Where(pp => strings.Any(s => (pp.LineCode ?? "").StartsWith(s)));