Linq 从IEnumerable中提取文本<;T>;

Linq 从IEnumerable中提取文本<;T>;,linq,Linq,我有一个带有姓名、全名和地址的IEnumerable集合 地址如下所示: Street1=54, Street2=redfer street, Pin=324234 Street1=54, Street2=fdgdgdfg street, Pin=45654 Street1=55, Street2=tryry street, Pin=65464 {Name="Jan" FullName="Kathy Jan" Address="Street1=54, Street2=redfer street

我有一个带有姓名、全名和地址的
IEnumerable
集合

地址如下所示:

Street1=54, Street2=redfer street, Pin=324234
Street1=54, Street2=fdgdgdfg street, Pin=45654
Street1=55, Street2=tryry street, Pin=65464
{Name="Jan" FullName="Kathy Jan" Address="Street1=54, Street2=redfer street, Pin=324234"}
我想循环浏览这个集合,只打印那些名字,即Street1=54的全名

在林克我怎么做

好的,我可以这样做来提取地址的Street1

coll.Address.Split(",".ToCharArray())[0]returns me Street1=54 . 
现在,我如何将其添加到条件中并仅打印那些街道1=54的名称、全名

var result = collection.Where(x => x.Address.Street1==54);
foreach ( var cur in result ) {
  Console.WriteLine(var.Name);
}
试试这个

var result = collection.Where(x => x.Address.Street1==54);
foreach ( var cur in result ) {
  Console.WriteLine(var.Name);
}

选择以下各项的正确列表:

IList<T> matches = myListOfEnumerables.Where(m => m.Street1 == 54).ToList();
IList matches=myListOfEnumerables.Where(m=>m.Street1==54.ToList();

然后循环打印

选择以下各项的正确列表:

IList<T> matches = myListOfEnumerables.Where(m => m.Street1 == 54).ToList();
IList matches=myListOfEnumerables.Where(m=>m.Street1==54.ToList();

然后循环打印

实际上,记录如下所示:

Street1=54, Street2=redfer street, Pin=324234
Street1=54, Street2=fdgdgdfg street, Pin=45654
Street1=55, Street2=tryry street, Pin=65464
{Name="Jan" FullName="Kathy Jan" Address="Street1=54, Street2=redfer street, Pin=324234"}

我必须循环浏览这个集合,只打印那些名字,那些街道1=54的全名,实际上记录是这样的:

Street1=54, Street2=redfer street, Pin=324234
Street1=54, Street2=fdgdgdfg street, Pin=45654
Street1=55, Street2=tryry street, Pin=65464
{Name="Jan" FullName="Kathy Jan" Address="Street1=54, Street2=redfer street, Pin=324234"}

我必须在这个集合中循环,只打印那些名称,即Street1=54的全名。如果更新的信息是准确的,您应该改变存储数据的方式

看起来您已将地址信息打包为字符串。为什么不将其存储为对象呢。事实上,为什么不在同一个对象中包含与Name和FullName一样多的字段呢?(为什么要复制名字信息?)

公共类人物
{
公共字符串FirstName、LastName、Street1、Street2、Pin;
}
IEnumerable persons=getAllPersons();
foreach(一人一人,其中(p=>p.Street1==“54”))
Console.WriteLine(person.LastName+“,”+person.FirstName);
假设必须将地址信息保存在字符串中,则需要一个解析器

public static IDictionary<string, string> GetAddressFields(string address)
{
    return address.Split(',').ToDictionary(
                s => s.Substring(0, s.IndexOf('=')).Trim(),
                s => s.Substring(s.IndexOf('=') + 1).Trim());
}


foreach (Person person in persons.Where(p => 
                GetAddressFields(p.Address)["Street1"] == "54")) 
    Console.WriteLine(person.LastName + ", " + person.FirstName);
公共静态IDictionary GetAddressFields(字符串地址)
{
返回地址。拆分(',')。ToDictionary(
s=>s.Substring(0,s.IndexOf('=')).Trim(),
s=>s.Substring(s.IndexOf('=')+1.Trim());
}
foreach(一人一人,其中(p=>
GetAddressFields(p.Address)[“Street1”]=“54”))
Console.WriteLine(person.LastName+“,”+person.FirstName);

如果更新的信息准确无误,则应更改存储数据的方式

看起来您已将地址信息打包为字符串。为什么不将其存储为对象呢。事实上,为什么不在同一个对象中包含与Name和FullName一样多的字段呢?(为什么要复制名字信息?)

公共类人物
{
公共字符串FirstName、LastName、Street1、Street2、Pin;
}
IEnumerable persons=getAllPersons();
foreach(一人一人,其中(p=>p.Street1==“54”))
Console.WriteLine(person.LastName+“,”+person.FirstName);
假设必须将地址信息保存在字符串中,则需要一个解析器

public static IDictionary<string, string> GetAddressFields(string address)
{
    return address.Split(',').ToDictionary(
                s => s.Substring(0, s.IndexOf('=')).Trim(),
                s => s.Substring(s.IndexOf('=') + 1).Trim());
}


foreach (Person person in persons.Where(p => 
                GetAddressFields(p.Address)["Street1"] == "54")) 
    Console.WriteLine(person.LastName + ", " + person.FirstName);
公共静态IDictionary GetAddressFields(字符串地址)
{
返回地址。拆分(',')。ToDictionary(
s=>s.Substring(0,s.IndexOf('=')).Trim(),
s=>s.Substring(s.IndexOf('=')+1.Trim());
}
foreach(一人一人,其中(p=>
GetAddressFields(p.Address)[“Street1”]=“54”))
Console.WriteLine(person.LastName+“,”+person.FirstName);

根据您的更新,您可以通过以下方式调整Jared Par的代码:

var result = collection.Where(x => x.Address.Contains("Street1=54"));
foreach ( var cur in result ) {
  Console.WriteLine(string.Format("{0}, {1}", cur.Name, cur.FullName));
}
如果希望能够使用变量插入Street1值,请执行以下操作:

var street1 = "54";
var result = collection.Where(x => x.Address.Contains("Street1=" + street1 ));
foreach ( var cur in result ) {
  Console.WriteLine(string.Format("{0}, {1}", cur.Name, cur.FullName));
}

顺便说一句,你真的应该更新你的问题或在一个特定的答案中添加注释,而不是添加一个新的答案。

根据你的更新,你可以这样修改Jared Par的代码:

var result = collection.Where(x => x.Address.Contains("Street1=54"));
foreach ( var cur in result ) {
  Console.WriteLine(string.Format("{0}, {1}", cur.Name, cur.FullName));
}
如果希望能够使用变量插入Street1值,请执行以下操作:

var street1 = "54";
var result = collection.Where(x => x.Address.Contains("Street1=" + street1 ));
foreach ( var cur in result ) {
  Console.WriteLine(string.Format("{0}, {1}", cur.Name, cur.FullName));
}

顺便说一句,你真的应该更新你的问题或给一个特定的答案添加注释,而不是添加一个新的答案。

因此,你可以做的是编写一个生成器来解析地址字段,然后枚举该字段的属性。这是函数式编程世界中相当常见的事情

公平地说,您希望这段代码是懒惰的,因为它只计算一个最小的集合。我将推荐BCL中的一些代码,但是您可以(而且可能应该)用生成器重写相同的helper方法

public static IEnumerable<KeyValuePair<string,string>> NameValueSplit( this string s )
{
    foreach (var x in s.Split(','))
    {
        var y = x.Split(new char[] { '=' }, 2, StringSplitOptions.None);
        yield return new KeyValuePair<string, string>(y[0].TrimStart(), y[1].TrimEnd());
    }
}

现在,如果您考虑到这一点,这段代码将不会在SQL Server上运行,但是您可以编写一个WHERE子句,在其中搜索地址字段中的子字符串%Street1=54%。我喜欢对字符串操作进行惰性评估,并认为这是BCL中缺少的特性。这就是我提出这种解决方案的原因。

因此,您可以编写一个生成器来解析地址字段,然后枚举该字段的属性。这是函数式编程世界中相当常见的事情

公平地说,您希望这段代码是懒惰的,因为它只计算一个最小的集合。我将推荐BCL中的一些代码,但是您可以(而且可能应该)用生成器重写相同的helper方法

public static IEnumerable<KeyValuePair<string,string>> NameValueSplit( this string s )
{
    foreach (var x in s.Split(','))
    {
        var y = x.Split(new char[] { '=' }, 2, StringSplitOptions.None);
        yield return new KeyValuePair<string, string>(y[0].TrimStart(), y[1].TrimEnd());
    }
}

现在,如果您考虑到这一点,这段代码将不会在SQL Server上运行,但是您可以编写一个WHERE子句,在其中搜索地址字段中的子字符串%Street1=54%。我喜欢对字符串操作进行惰性评估,并认为这是BCL中缺少的特性。这就是我提出这种解决方案的原因。

如果您只需将结果向前循环一次,则不需要IList,因此也不需要.ToList()。请参阅JaredPar的答案。如果您只需将结果向前循环一次,则不需要IList,因此也不需要.ToList()。看看JaredPar的答案,我能这样做吗?var result=collection.Where(x=>x.Address.Contains(“Street1=“+Street1)).OrderByDescending(x=>x.Name.Length);我可以这样做吗?var result=collection.Where(x=>x.Address.Contains(“Street1=“+Street1)).OrderByDescending(x=>x)。