1
public class ReduceResult
{
    public string Text { get; set; }
    public string UserName { get; set; }
    public string ProfileImageUrl { get; set; }
}

样本记录:

UserName        Text
UsernameA       Text1, Text2, Text3 
UsernameB       Text2, Text3, Text4
UsernameC       Text1, Text2, Text3

我要求用户包含 where 子句中提到的所有文本。例如

如果 where 子句包含 Text IN { Text1, Text2, Text3 },我应该得到 User 的记录,'A'因为'C'所有必需的文本都包含在他们的记录中。我不应该得到用户'B'记录,因为'Text1'他的记录中没有。我需要使用它来实现它LINQ。你能指导我正确的方向吗?

4

3 回答 3

0

你应该这样做:

string[] texts = new string[]{"Text1", "Text2", "Text3"};
var records = from x in list
              let a = from b in x.Text.Split(',') select b.Trim()
              where a.Intersect(texts).Count() == texts.Count()
              select x;
于 2013-07-26T03:13:12.143 回答
0

如果可以修改 ReduceResult 类,那么可以实现 IEquatable 并添加 Equals 方法并覆盖 GetHashCode()。像这样:

public class ReduceResult: IEquatable<ReduceResult>
{
    public string Text { get; set; }
    public string UserName { get; set; }
    public string ProfileImageUrl { get; set; }

    public bool Equals(ReduceResult other)
    {

    }

    public override int GetHashCode()
    {

    }   
}

然后,您可以像 int、string 等任何其他主要类型一样比较这两个 ReduceResult。例如,ReduceResult1 == ReduceResult2

如果没有,那么您可以创建一个 Comparer 类:

class ReduceResultComparer : IEqualityComparer<ReduceResult>
{
    public bool Equals(ReduceResult x, ReduceResult y)
    {

    }

    public int GetHashCode(ReduceResult reduceresult)
    {

    }
}

并像这样使用它:

    //This outside your linq query
    var comparer = new ReduceResultComparer(); 

    //This inside query
    comparer.Equals(ReduceResult1, ReduceResult2) 
于 2013-07-26T02:08:12.313 回答
0

如果我正确理解您的问题,那只是像这样的常规 where 子句。

var data = from x in listOfObjects
                   where x.Text == "Text1, Text2, Text3"
                   select new ReduceResult
                   {
                       UserName = x.UserName,
                       ProfileImageUrl = x.ProfileImageUrl,
                       Text = x.Text,
                   };
于 2013-07-26T02:08:55.963 回答